GET
H/1.1
|
200
OK
|
Primary Request
Cookie set
/
Show response
www.golem.de/
Redirect Chain
-
http://golem.de/
-
https://www.golem.de/
|
188 KB
188 KB
|
112ms
37ms
|
Document
text/html |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_126-min.css
www.golem.de/staticrl/styles/
|
73 KB
20 KB
|
90ms
40ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
metaTag.min.js
Show response
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
|
242 KB
58 KB
|
77ms
6ms
|
Script
application/javascript |
2a02:26f0:6c00:189::5f76
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
logo-g.png
www.golem.de/staticrl/images/
|
4 KB
4 KB
|
75ms
22ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139268-186652-186650_rc.jpg
www.golem.de/1902/
|
16 KB
16 KB
|
72ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139287-186759-186756_rc.jpg
www.golem.de/1902/
|
6 KB
6 KB
|
33ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139279-186713-186710_rc.jpg
www.golem.de/1902/
|
6 KB
6 KB
|
40ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139286-186750-186747_rc.jpg
www.golem.de/1902/
|
6 KB
6 KB
|
29ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139261-186625-186622_rc.jpg
www.golem.de/1902/
|
9 KB
9 KB
|
33ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
75ms
19ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
blender28tut-snap.jpg
video.golem.de/teaser/1/1/22453/thumb-high-1000/
|
89 KB
89 KB
|
75ms
17ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
vii-amd.jpg
video.golem.de/teaser/1/1/22461/thumb-high-1000/
|
116 KB
116 KB
|
59ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
65ms
15ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139065-185677-185676_rc.jpg
www.golem.de/1902/
|
181 KB
182 KB
|
41ms
38ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
138987-185310-185309_rc.jpg
www.golem.de/1902/
|
152 KB
153 KB
|
21ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_114-min.js
Show response
www.golem.de/staticrl/scripts/
|
100 KB
41 KB
|
27ms
27ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
longread-swiper_128-min.js
Show response
www.golem.de/staticrl/scripts/
|
2 KB
1 KB
|
22ms
20ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
account_js_dt18_1_0.php
Show response
www.golem.de/abo/
|
88 B
474 B
|
25ms
22ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sdcv.js
Show response
ads.golem.de/
|
63 B
430 B
|
83ms
16ms
|
Script
application/javascript |
2a00:13c8:f5::f:4b3d:17a
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
31 KB
10 KB
|
164ms
47ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
|
40 KB
11 KB
|
41ms
41ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/tag/js/gpt.js
- Requested by
- Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 7f4c79ef3b9ad8186e44d5f06491aa0947af98f0e68c07708f900f57a5f2e141
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
263 KB
78 KB
|
72ms
12ms
|
Script
application/javascript |
54.230.93.134
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
114 KB
44 KB
|
90ms
23ms
|
Script
text/javascript |
2.18.233.67
Akamai Technologies
|
|
|
GET
H/1.1
|
302
Moved Temporarily
|
dmp
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://tracking.m6r.eu/sync/dmp
-
https://tracking.m6r.eu/sync/dmp?checkcookies=true
|
0
-1 B
|
224ms
224ms
|
XHR
text/plain |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
rc
Show response
si.nuggad.net/
|
848 B
940 B
|
256ms
45ms
|
Script
text/javascript |
80.82.201.88
UNBELIEVABLE-AS
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
|
22 KB
22 KB
|
25ms
18ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
|
22 KB
22 KB
|
29ms
18ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
|
21 KB
21 KB
|
47ms
38ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
325 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
258 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
126 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
147 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
153 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
768 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
|
20 KB
20 KB
|
19ms
18ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif-Bold.woff2
www.golem.de/staticrl/fonts/droidserif/
|
26 KB
26 KB
|
19ms
18ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
22ms
20ms
|
Script
application/javascript |
2a00:1450:4001:81b::2002
Google LLC
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
21ms
19ms
|
Script
application/javascript |
2a00:1450:4001:806::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
pubads_impl_2019020401.js
Show response
securepubads.g.doubleclick.net/gpt/
|
181 KB
62 KB
|
42ms
40ms
|
Script
text/javascript |
216.58.208.34
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
submit
lb65.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
95ms
13ms
|
Image
image/gif |
136.243.3.97
HETZNER-AS
|
|
General
- Full URL
- https://lb65.s400.meetrics.net/bb-mx/submit?/rkiFBNAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FoywAx5AtwAxtAyxAtxAw6A1wAt2A35A2wAwtAyuAxwA2uAytAxkExlE4mEwkEL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSxZBPAAAAAAAAAOAAAAGEAAAAAAZwSxZBBRksFAQtjFQmsrSA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.97
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h222.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb65.s400.meetrics.net/
|
43 B
308 B
|
93ms
13ms
|
Image
image/gif |
136.243.3.97
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
btn-follow-sp4.png
www.golem.de/staticrl/images/
|
4 KB
4 KB
|
24ms
22ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
|
119 B
614 B
|
63ms
62ms
|
XHR
application/json |
2.19.33.59
AKAMAI-ASN1
|
|
|
POST
H2
|
204
|
translator
Show response
hbopenbid.pubmatic.com/
|
0
114 B
|
162ms
99ms
|
XHR
text/plain |
185.64.189.112
PubMatic
|
|
|
GET
H2
|
200
|
arj
Show response
yieldlove-d.openx.net/w/1.0/
|
14 KB
2 KB
|
271ms
220ms
|
XHR
application/json |
173.241.240.220
OPENX TECHNOLOGIES
|
|
General
- Full URL
- https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.golem.de%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=0&tws=1600x1200&be=1&bc=hb_pb_2.1.4&dddid=c80ebfa6-8662-4487-accd-30d3fd84e5f6%2C25839866-9446-41c5-9d23-45cc65ddfd4a%2C16286798-c776-44ff-b456-b9ef39255ce0%2Cedc60849-5ae3-412e-ae38-887608207dd1%2Ca0079b7c-26d8-4f13-8a81-8a83d1dabedd%2C630b2672-86ca-4b3e-91e2-df241262730d%2C4a938338-7d00-46fe-af8e-bc453bec0a97&nocache=1549653848082&x_gdpr_f=1&aus=300x250%7C300x600%2C160x600%2C120x600%7C300x600%2C300x250%7C770x250%7C970x250%2C970x90%2C800x250%2C728x90%7C970x250%2C770x250%2C800x250%2C728x90%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle2%2Csky%2Crectangle%2Cbillboard%2Cbanner%2Cbillboard2%2Cbanner3&auid=540523394%2C540523392%2C540523393%2C540523395%2C540523387%2C540523389%2C540523390&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, CHACHA20_POLY1305
- Server
-
173.241.240.220
New York, United States,
ASN36089
(OPENX-AS1 - OPENX TECHNOLOGIES, INC., US),
- Reverse DNS
- ox-173-241-240-220.xa.dc.openx.org
- Software
-
OXGW/16.121.0 /
- Resource Hash
- 5a890063680acbda864c949d5da1a1b0da6e91fcc991b87ced245bbd43b58447
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
423ms
340ms
|
XHR
application/json |
185.86.139.19
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
256ms
174ms
|
XHR
application/json |
185.86.139.19
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
496ms
414ms
|
XHR
application/json |
185.86.139.19
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
471ms
390ms
|
XHR
application/json |
185.86.139.19
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
414ms
332ms
|
XHR
application/json |
185.86.139.19
SMARTADSERVER
|
|
|
POST
H/1.1
|
307
Temporary Redirect
|
dsh
Show response
hb.adscale.de/
Redirect Chain
-
https://hb.adscale.de/dsh
-
https://hb.adscale.de/dsh?uu=626331549653848150
|
0
-1 B
|
74ms
22ms
|
XHR
|
184.30.220.71
AKAMAI-ASN1
|
|
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
2 KB
2 KB
|
380ms
322ms
|
XHR
application/json |
185.33.223.216
AppNexus
|
|
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
79 KB
30 KB
|
25ms
23ms
|
Script
text/javascript |
2a00:1450:4001:816::2002
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
golem_csi-121-min.js
Show response
www.golem.de/staticrl/scripts/adsense/
|
2 KB
1 KB
|
26ms
24ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gx-ads.js
Show response
ads.golem.de/track.ads/
|
226 B
594 B
|
15ms
14ms
|
Script
application/javascript |
2a00:13c8:f5::f:4b3d:17a
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
cdn.m6r.eu/sync/
|
1 KB
1 KB
|
112ms
24ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
POST
H/1.1
|
200
OK
|
dsh
Show response
hb.adscale.de/
|
11 B
393 B
|
289ms
288ms
|
XHR
text/plain |
184.30.220.71
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
tx.io
Show response
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0010&i2=001002a8e6b485cc15c5dd757&ep=1579089342&vr=412&id=s9k4q...
-
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0010&i2=001002a8e6b485cc15c5dd757&ep=1579089342&vr=412&id=s9k4q...
|
0
694 B
|
49ms
46ms
|
Script
application/x-javascript |
91.215.100.40
INFONLINE-AS
|
|
General
- Full URL
- https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0010&i2=001002a8e6b485cc15c5dd757&ep=1579089342&vr=412&id=s9k4qs&i3=001002a8e6b485cc15c5dd757%3A1579721048212%3A1549653848212%3A.golem.de%3A1%3A1549653848212%21ckm92e&n1=1&dntt=0<=1549653848220&ev=&cs=wvo327&mo=1&sr=71
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
91.215.100.40
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de4.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.05.0 0023
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
IjvnOpbzskTW
Show response
cdn.onthe.io/io.js/
|
71 KB
27 KB
|
97ms
25ms
|
Script
text/javascript |
142.93.164.163
DigitalOcean
|
|
|
GET
H2
|
200
|
ga.js
Show response
www.google-analytics.com/
|
45 KB
17 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:821::200e
Google LLC
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
64ms
15ms
|
Script
application/javascript |
2600:9000:200d:3800:15:efbc:e300:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
swiper-4.2.2.custom.min.js
Show response
www.golem.de/staticrl/scripts/external/
|
69 KB
23 KB
|
30ms
29ms
|
XHR
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_cpxl_113-min.js
Show response
www.golem.de/staticrl/scripts/
|
8 KB
4 KB
|
24ms
22ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
nexusone-snap.jpg
video.golem.de/teaser/1/1/22436/thumb-high-1000/
|
94 KB
94 KB
|
20ms
17ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
rage2angespielt2.jpg
video.golem.de/teaser/1/1/22424/thumb-high-1000/
|
101 KB
102 KB
|
19ms
16ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
ottobock-snap.jpg
video.golem.de/teaser/1/1/22432/thumb-high-1000/
|
102 KB
102 KB
|
61ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
tuxkrt-snap.jpg
video.golem.de/teaser/1/1/22418/thumb-high-1000/
|
127 KB
127 KB
|
62ms
16ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
anno-snap.jpg
video.golem.de/teaser/1/1/22410/thumb-high-1000/
|
157 KB
157 KB
|
59ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139285-186746-186743_rc.jpg
www.golem.de/1902/
|
6 KB
6 KB
|
27ms
26ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139199-186333-186330_rc.jpg
www.golem.de/1902/
|
7 KB
7 KB
|
21ms
21ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139283-186739-186736_rc.jpg
www.golem.de/1902/
|
10 KB
10 KB
|
22ms
22ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139195-186704-186701_rc.jpg
www.golem.de/1902/
|
8 KB
8 KB
|
32ms
28ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139284-186735-186732_rc.jpg
www.golem.de/1902/
|
11 KB
11 KB
|
26ms
23ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139024-186033-186029_rc.jpg
www.golem.de/1902/
|
153 KB
154 KB
|
29ms
26ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139040-185964-185961_rc.jpg
www.golem.de/1902/
|
107 KB
107 KB
|
25ms
23ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139282-186726-186723_rc.jpg
www.golem.de/1902/
|
8 KB
8 KB
|
28ms
27ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139280-186722-186719_rc.jpg
www.golem.de/1902/
|
8 KB
9 KB
|
28ms
27ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139240-186530-186527_rc.jpg
www.golem.de/1902/
|
5 KB
6 KB
|
25ms
24ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139256-186614-186613_rc.jpg
www.golem.de/1902/
|
6 KB
7 KB
|
26ms
25ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139188-186453-186450_rc.jpg
www.golem.de/1902/
|
6 KB
6 KB
|
25ms
24ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139277-186709-186706_rc.jpg
www.golem.de/1902/
|
5 KB
5 KB
|
25ms
24ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
138906-186590-186589_rc.jpg
www.golem.de/1902/
|
5 KB
6 KB
|
34ms
23ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139276-186699-186696_rc.jpg
www.golem.de/1902/
|
9 KB
9 KB
|
28ms
24ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137327-177418-177414_rc.jpg
www.golem.de/1810/
|
5 KB
6 KB
|
25ms
24ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139206-186374-186370_rc.jpg
www.golem.de/1902/
|
8 KB
8 KB
|
24ms
22ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139275-186695-186692_rc.jpg
www.golem.de/1902/
|
6 KB
7 KB
|
24ms
23ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139274-186678-186675_rc.jpg
www.golem.de/1902/
|
9 KB
10 KB
|
21ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139113-185903-185900_rc.jpg
www.golem.de/1902/
|
5 KB
6 KB
|
22ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139272-186664-186660_rc.jpg
www.golem.de/1902/
|
10 KB
10 KB
|
21ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139019-186154-186150_rc.jpg
www.golem.de/1902/
|
8 KB
8 KB
|
22ms
21ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139271-186671-186666_rc.jpg
www.golem.de/1902/
|
9 KB
9 KB
|
20ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139273-186674-186669_rc.jpg
www.golem.de/1902/
|
8 KB
8 KB
|
21ms
21ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139241-186536-186531_rc.jpg
www.golem.de/1902/
|
8 KB
8 KB
|
19ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139269-186656-186655_rc.jpg
www.golem.de/1902/
|
7 KB
8 KB
|
20ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139267-186649-186646_rc.jpg
www.golem.de/1902/
|
7 KB
8 KB
|
21ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
139266-186645-186642_rc.jpg
www.golem.de/1902/
|
8 KB
8 KB
|
21ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
138898-185006-185002_rc.jpg
www.golem.de/1902/
|
8 KB
8 KB
|
21ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_138195-181908-181906_rc.jpg
www.golem.de/1901/
|
22 KB
22 KB
|
21ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_139053-185822-185820_rc.jpg
www.golem.de/1901/
|
21 KB
21 KB
|
24ms
22ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_139077-185723-185721_rc.jpg
www.golem.de/1901/
|
17 KB
18 KB
|
22ms
21ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_139044-185664-185662_rc.jpg
www.golem.de/1901/
|
31 KB
31 KB
|
22ms
21ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_139082-185749-185747_rc.jpg
www.golem.de/1901/
|
16 KB
16 KB
|
27ms
27ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_138934-185118-185116_rc.jpg
www.golem.de/1901/
|
16 KB
16 KB
|
24ms
23ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_138830-184767-184765_rc.jpg
www.golem.de/1901/
|
17 KB
17 KB
|
21ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_139014-185428-185426_rc.jpg
www.golem.de/1901/
|
19 KB
19 KB
|
23ms
21ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_139016-185423-185421_rc.jpg
www.golem.de/1901/
|
19 KB
19 KB
|
26ms
25ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_138983-185283-185281_rc.jpg
www.golem.de/1901/
|
24 KB
24 KB
|
23ms
22ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_138712-184035-184033_rc.jpg
www.golem.de/1901/
|
14 KB
14 KB
|
26ms
22ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_138876-185187-185184_rc.jpg
www.golem.de/1901/
|
25 KB
26 KB
|
24ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_138981-185373-185371_rc.jpg
www.golem.de/1901/
|
27 KB
27 KB
|
21ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_138964-185203-185201_rc.jpg
www.golem.de/1901/
|
25 KB
25 KB
|
23ms
22ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_138764-184254-184252_rc.jpg
www.golem.de/1901/
|
17 KB
17 KB
|
24ms
23ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
cpx.php
cpx.golem.de/
|
42 B
420 B
|
420ms
23ms
|
Image
image/gif |
77.247.84.149
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_bW2P-278000-i_rc.jpg
www.golem.de/9143/
|
68 B
486 B
|
64ms
63ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
collect
stats.g.doubleclick.net/r/
Redirect Chain
-
https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=2667560&utmhn=www.golem.de&utme=8(HTML5)9(1)11(2)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0&u...
-
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=279128799.1549653848&jid=1441035031&_v=5.7.2&z=2667560
|
35 B
102 B
|
17ms
15ms
|
Image
image/gif |
2a00:1450:400c:c08::9a
Google LLC
|
|
General
- Full URL
- https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=279128799.1549653848&jid=1441035031&_v=5.7.2&z=2667560
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:400c:c08::9a
, Ireland,
ASN15169
(GOOGLE - Google LLC, 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
H/1.1
|
200
OK
|
Cookie set
/
d.agkn.com/iframe/8613/
Frame 8940
|
0
0
|
444ms
110ms
|
Document
text/html |
52.86.164.68
Amazon.com
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=454285249&gdpr=&gdpr_consent=&url=https%3A%2F%2Fwww.golem.de%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.golem.de%2F%22%2C%22gdpr%22%3A%22%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
- Requested by
- Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.86.164.68
Ashburn, United States,
ASN14618
(AMAZON-AES - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-86-164-68.compute-1.amazonaws.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
30ms
29ms
|
Script
text/javascript |
2.19.33.59
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n3=1&n4=0&n5=5&n6=2&n7=2&n8=5&n9=0&n10=1&n11=1&n12=6&n17=4&n18=2&n20=2&n21=4&n33=4&n38=2&n39=4&n43=3&n44=3&n46=4&n52=2&n57=3&n58=4&n60=3&n62=3&n67=0&n70=3&n71=1&n75=0&n76=1&n77=0&n78=1&n79=1&n80=0&n81=1&n82=1&n83=0&n84=0&n85=1&n86=0&n87=0&n88=1&n117=2&n118=6&n119=3&n120=2&n121=2&n122=1&n123=2&n127=0&n128=2&n135=9&n15=1&n66=1&n89=2&n90=1&n92=1&n93=3&n94=2&n97=1&n98=1&n99=1&n101=1&n104=1&n106=1&n107=1&n114=1&n115=1&n124=1&n125=1&n126=1&n139=1&n153=1&n154=1&n155=1&n156=1&n157=1&n158=1&n159=1&n160=1&n161=1
- Requested by
- Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.19.33.59
, European Union,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a2-19-33-59.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- 5c327d2a8b831e9ae35540a9b163485242b84429247cf8d69608eea506d97987
|
GET
H/1.1
|
200
OK
|
rmpslider-rl_128-min.js
Show response
www.golem.de/staticrl/scripts/radiant/
|
16 KB
7 KB
|
27ms
24ms
|
XHR
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
62ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
61ms
16ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
61ms
16ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
61ms
17ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/
|
193 KB
71 KB
|
33ms
28ms
|
Script
text/javascript |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:816::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 772936df0f7b91673c2c52dbd0f83f9382d8ad1218a620bbb453cb8a0e3ea251
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/
Frame 31D2
|
193 KB
71 KB
|
26ms
26ms
|
Script
text/javascript |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:816::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 772936df0f7b91673c2c52dbd0f83f9382d8ad1218a620bbb453cb8a0e3ea251
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
ca-pub-2342548244565729.js
Show response
pagead2.googlesyndication.com/pub-config/r20160913/
|
133 B
235 B
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-2342548244565729.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:816::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190204/r20190131/
Frame CC4B
|
0
0
|
9ms
4ms
|
Document
text/html |
2a00:1450:4001:809::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20190204/r20190131/zrt_lookup.html
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:809::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
416ms
108ms
|
XHR
application/json |
52.216.10.45
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
homadclienthttpsle-json.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
291 B
682 B
|
60ms
14ms
|
XHR
application/json |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
rmp.min.js
Show response
www.golem.de/staticrl/scripts/radiant/4.9.1/js/
|
378 KB
110 KB
|
27ms
25ms
|
XHR
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
userconnect.js
Show response
js.adscale.de/
|
12 KB
4 KB
|
91ms
20ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
141ms
35ms
|
XHR
text/javascript |
95.216.24.148
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:uniques_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:940ff91d9.8a31a7f20_1549653848561,cdn_version:6]&s=6acc7c777cce3be138a245218c439c54&1549653848565
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
95.216.24.148
, Ukraine,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.148.24.216.95.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/uniques/
|
33 B
514 B
|
173ms
35ms
|
Script
text/html |
95.216.24.148
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
160ms
30ms
|
XHR
text/javascript |
95.216.24.148
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:visits_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:940ff91d9.8a31a7f20_1549653848561,cdn_version:6]&s=6acc7c777cce3be138a245218c439c54&__io=940ff91d9.8a31a7f20_1549653848561&1549653848571
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
95.216.24.148
, Ukraine,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.148.24.216.95.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
158ms
30ms
|
XHR
text/javascript |
95.216.24.148
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:pageviews[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:940ff91d9.8a31a7f20_1549653848561,cdn_version:6]&s=6acc7c777cce3be138a245218c439c54&1549653848574
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
95.216.24.148
, Ukraine,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.148.24.216.95.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=e9f7e30eaec7a49a8083ef2bc5e6e500&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3De9f7e30eaec7a49a8083ef2bc5e6e500%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=e9f7e30eaec7a49a8083ef2bc5e6e500&userId=adscale-user:626331549653848150
|
44 B
528 B
|
36ms
28ms
|
Image
image/gif |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
setuid
ib.adnxs.com/
Redirect Chain
-
https://tracking.m6r.eu/sync/appnexusRedirect
-
https://ib.adnxs.com/setuid?entity=197&code=e9f7e30eaec7a49a8083ef2bc5e6e500
|
43 B
984 B
|
34ms
20ms
|
Image
image/gif |
185.33.223.216
AppNexus
|
|
|
GET
H/1.1
|
200
OK
|
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=6ffjDq7HpJqAg-8rxeblAA
-
https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=6ffjDq7HpJqAg-8rxeblAA&google_tc=
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
|
44 B
523 B
|
27ms
25ms
|
Image
image/gif |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
204
No Content
|
m
ad.yieldlab.net/
Redirect Chain
-
https://tracking.m6r.eu/sync/yieldlabRedirect
-
https://ad.yieldlab.net/m?dt_id=36356&ext_id=e9f7e30eaec7a49a8083ef2bc5e6e500
|
0
495 B
|
76ms
31ms
|
Image
text/plain |
2.16.122.151
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
333 B
991 B
|
60ms
12ms
|
XHR
application/json |
54.230.93.94
Amazon.com
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
146 KB
26 KB
|
409ms
408ms
|
XHR
text/plain |
216.58.208.34
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3649357497696256&correlator=3046591982102226&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fifs&adsid=NT&json_a=1&eid=21063144%2C21062377%2C21062456%2C21063161&vrg=2019020401&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-31&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=120x600%7C160x600%7C200x600%7C300x600%7C10x40%7C10x30%7C10x20%2C728x90%7C728x180%7C770x250%7C20x10%7C30x10%7C40x10%7C80x10%7C800x250%7C970x250%2C300x250%7C300x601%7C300x125%7C10x20%7C10x10%2C770x251%7C800x251%7C970x251%7C20x10%7C30x10%7C40x10%7C80x10%7C100x10%2C800x450%7C580x500%2C301x250%7C300x126%7C10x10&prev_scp=adslot%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Csky%2Chpad%2Cband%26rfree%3D200-299%26pc%3D1%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_placement%3Dsky%7Cadslot%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cbb%2Cvidwa%26pc%3D1%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_placement%3Dbanner%7Cadslot%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec%26pc%3D1%26yieldlove_meta%3Dpid%253A17299.sb%253Af%26yieldlove_pid%3D17299%26yieldlove_hb_sucbid%3Dfalse%26hb_placement%3Drectangle%7Cadslot%3Dbillboard2%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cf10x1%26pc%3D1%26yieldlove_meta%3Dpid%253A17296.sb%253Af%26yieldlove_pid%3D17296%26yieldlove_hb_sucbid%3Dfalse%26hb_placement%3Dbillboard2%7Cadslot%3Dposterad%26af%3Dptad%2Cintxspt%26pc%3D1%7Cadslot%3Drectangle2%26af%3Df1x1%2Cmrec%26pc%3D1%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_placement%3Drectangle2&cust_params=tagm%3Dmt%26flashVersion%3D0%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26adset%3Dbrsl%26flash%3Dno%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26mbrStatus%3Dcalled-idfound%26mbrid%3De9f7e30eaec7a49a8083ef2bc5e6e500%26mbrseg%3Db3838f1f%252C134dad1c%252C781245b2%252C3e05b94d%252C8be7d6d2%26nuggad%3Dn3-1%252Cn4-0%252Cn5-5%252Cn6-2%252Cn7-2%252Cn8-5%252Cn9-0%252Cn10-1%252Cn11-1%252Cn12-6%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn33-4%252Cn38-2%252Cn39-4%252Cn43-3%252Cn44-3%252Cn46-4%252Cn52-2%252Cn57-3%252Cn58-4%252Cn60-3%252Cn62-3%252Cn67-0%252Cn70-3%252Cn71-1%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-1%252Cn79-1%252Cn80-0%252Cn81-1%252Cn82-1%252Cn83-0%252Cn84-0%252Cn85-1%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-2%252Cn118-6%252Cn119-3%252Cn120-2%252Cn121-2%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-2%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-2%252Cn90-1%252Cn92-1%252Cn93-3%252Cn94-2%252Cn97-1%252Cn98-1%252Cn99-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn107-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn153-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn157-1%252Cn158-1%252Cn159-1%252Cn160-1%252Cn161-1&cookie_enabled=1&bc=15&lmt=1549653848&dt=1549653848651&dlt=1549653847494&idt=619&frm=20&biw=1585&bih=1200&oid=3&adxs=0%2C0%2C0%2C0%2C0%2C0&adys=0%2C0%2C0%2C0%2C0%2C0&adks=2129558987%2C973278271%2C2964933683%2C3798284268%2C3262996680%2C638100629&ucis=1%7C2%7C3%7C4%7C5%7C6&ifi=5&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=51&icsg=194510655078144&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&blev=1&bisch=1&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=true&fws=128%2C128%2C128%2C128%2C128%2C128
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
216.58.208.34
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s12-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 30bbcc667eb9bffbb14462a7483c5da0a13873b20dfc60187de666b5be5251b3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
pubads_impl_rendering_2019020401.js
Show response
securepubads.g.doubleclick.net/gpt/
|
64 KB
24 KB
|
46ms
45ms
|
Script
text/javascript |
216.58.208.34
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
216.58.208.34
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s12-in-f2.1e100.net
- Software
-
sffe /
- Resource Hash
- 95b19c951f8010a75196c9ef97e9ed4ac0bef10221a0e28f18441a29a5a4552b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-31/html/
|
0
0
|
6ms
6ms
|
Other
text/html |
2a00:1450:4001:819::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-31/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H/1.1
|
200
OK
|
sp_bW2P-577022-i_rc.jpg
www.golem.de/9532/adfarm/
|
68 B
486 B
|
77ms
65ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
|
200 KB
54 KB
|
13ms
12ms
|
XHR
application/javascript |
54.230.93.94
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
trial-medrec-m3-140.shtml
Show response
www.golem.de/microsite/abo/
Frame F565
|
498 B
782 B
|
21ms
20ms
|
Document
text/html |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
userconnect
Show response
ih.adscale.de/
|
478 B
859 B
|
30ms
29ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame ACF6
|
0
0
|
336ms
334ms
|
Document
text/html |
2a00:1450:4001:809::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1549653848&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1549653848419&bpp=31&bdt=924&fdt=329&idt=327&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&correlator=3628514731309&frm=20&pv=2&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=53&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=3998&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=636311223&ifi=1&uci=1.ym0tu0r9htxk&fsb=1&xpc=qSUf37tVJG&p=https%3A//www.golem.de&dtd=366
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:809::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
|
76 KB
28 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- a9161d73cd6490abd72bc80bb1812c24ff04501c0cc458fa72a1df2cb96efa5c
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 0D1B
|
0
0
|
356ms
355ms
|
Document
text/html |
2a00:1450:4001:809::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1549653848&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1549653848450&bpp=8&bdt=955&fdt=361&idt=296&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=3628514731309&frm=20&pv=1&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=54&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4719&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=1823298079&ifi=2&uci=2.k9cjnrsesiw9&fsb=1&xpc=bVZ23Xc937&p=https%3A//www.golem.de&dtd=364
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:809::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
vgs.json
Show response
cdn.radiantmediatechs.com/rmp/rr/
|
4 KB
2 KB
|
53ms
10ms
|
XHR
application/json |
2606:4700:30::6818:6724
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
|
57 KB
12 KB
|
20ms
20ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame D610
|
0
0
|
81ms
81ms
|
Document
text/html |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
nuggad
ih.adscale.de/adscale-ih/
Frame F670
Redirect Chain
-
https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=https%3A%2F%2Fgolem.de%2F&nuggl=https%3A%2F%2Fih.adscale.de%2Fadscale-ih%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYzU5MzQw%2F...
-
https://ih.adscale.de/adscale-ih/nuggad?/nu/0/pre/0/sid/YzU5MzQw/uu/626331549653848150/ts/1549653848742/v/2/hid/431/ssl/1/lb/node20.lb.adscale.de/ws/https%3A%2F%2Fwww.golem.de%2F/nvars/d1=1&d9=2&d8...
|
49 B
489 B
|
83ms
82ms
|
Image
image/gif |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
20ms
20ms
|
Image
image/gif |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame BF8B
|
0
0
|
256ms
255ms
|
Document
text/html |
2a00:1450:4001:809::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1549653848&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1549653848458&bpp=6&bdt=964&fdt=436&idt=288&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=3628514731309&frm=20&pv=1&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=54&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5408&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=154924829&ifi=3&uci=3.yxt7u1p0k7l4&fsb=1&xpc=wC8K1EYXA0&p=https%3A//www.golem.de&dtd=439
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:809::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
30ms
23ms
|
XHR
text/javascript |
95.216.24.148
HETZNER-AS
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
|
200 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
spalte_rechts_Abo_3_1b_300x140px.png
www.golem.de/microsite/abo/trial/
Frame F565
|
11 KB
11 KB
|
19ms
18ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
|
235 KB
81 KB
|
42ms
41ms
|
Script
text/javascript |
2a00:1450:4001:808::200a
Google LLC
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
68 B
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
2 KB
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
715 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
|
8 KB
9 KB
|
20ms
19ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
General
- Full URL
- https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/rmp-font.woff2?vj7w12
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
77.247.84.129
Berlin, Germany,
ASN25291
(SYSELEVEN SysEleven GmbH, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
|
GET
H/1.1
|
200
OK
|
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
|
15 KB
15 KB
|
20ms
20ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
General
- Full URL
- https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/roboto-v18-latin-regular.woff2
- Requested by
- Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
77.247.84.129
Berlin, Germany,
ASN25291
(SYSELEVEN SysEleven GmbH, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
|
GET
|
|
osd_listener.js
www.googletagservices.com/activeview/js/current/
Frame E05F
|
0
0
|
|
|
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
/
servedby.flashtalking.com/imp/2/103389;3586916;201;jsiframe;BusinessAdDE;v0103CPMMittelstandschannelBusinessGiroWPBannerxxalwaysonxxxxxxxxx/
Frame D8A4
|
0
0
|
151ms
45ms
|
Document
text/html |
205.185.216.10
Highwinds Network...
|
|
General
- Full URL
- https://servedby.flashtalking.com/imp/2/103389;3586916;201;jsiframe;BusinessAdDE;v0103CPMMittelstandschannelBusinessGiroWPBannerxxalwaysonxxxxxxxxx/?ft_custom=&imageType=gif&ftDestID=22298292&ft_width=728&ft_height=90&click=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvx4KTmZkRB93VaGJSvWpN3dgT0l-7CmH71O78nkUjtkFNP_QMPPHMSDNdYU-o3imr1btRjpHDApAg6xumkxk5JSiYg1DiIvCzOyYSwgyUE1g-54Qza6s0thgs4vcpm8XghvaJnHVJVG2_ALeiazxODHV2v8I2UK6nzVxKuPv9flkQ1VUOLQC4bhOqSSlCitYHJGyPzXiPbE3aPbmlK37yzFlFObPd5CGBwX9QnpB4kFpbArcfTmMLEnZdR7m5W01iBtOSu96zQdwFI%2526sai%253DAMfl-YSg-35x9vVTN9cqjJ--ZvHPHlEaOP6R9DCYPGWbpm4PKzzE-BXWXAEco0vLzuAKrJT4JjfaBKo-MCbjowqbhn4GTb5L3d0m1g6eVHZiDs3uWza1XABTpjIo2Vo%2526sig%253DCg0ArKJSzHNgD76uoJJREAE%2526urlfix%253D1%2526adurl%253D&ftOBA=1&ftExpTrack=&cachebuster=1319094761
- Requested by
- Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
205.185.216.10
Phoenix, United States,
ASN20446
(HIGHWINDS3 - Highwinds Network Group, Inc., US),
- Reverse DNS
- map2.hwcdn.net
- Software
-
prod-xre-app1.frk11 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
Cookie set
/
servedby.flashtalking.com/imp/2/103389;3586917;201;jsiframe;BusinessAdDE;v0103CPMMittelstandschannelBusinessGiroWPSkyxxalwaysonxxxxxxxxx/
Frame 749B
|
0
0
|
200ms
44ms
|
Document
text/html |
205.185.216.10
Highwinds Network...
|
|
General
- Full URL
- https://servedby.flashtalking.com/imp/2/103389;3586917;201;jsiframe;BusinessAdDE;v0103CPMMittelstandschannelBusinessGiroWPSkyxxalwaysonxxxxxxxxx/?ft_custom=&imageType=gif&ftDestID=22298293&ft_width=200&ft_height=600&click=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvx4KTmZkRB93VaGJSvWpN3dgT0l-7CmH71O78nkUjtkFNP_QMPPHMSDNdYU-o3imr1btRjpHDApAg6xumkxk5JSiYg1DiIvCzOyYSwgyUE1g-54Qza6s0thgs4vcpm8XghvaJnHVJVG2_ALeiazxODHV2v8I2UK6nzVxKuPv9flkQ1VUOLQC4bhOqSSlCitYHJGyPzXiPbE3aPbmlK37yzFlFObPd5CGBwX9QnpB4kFpbArcfTmMLEnZdR7m5W01iBtOSu96zQdwFI%2526sai%253DAMfl-YSg-35x9vVTN9cqjJ--ZvHPHlEaOP6R9DCYPGWbpm4PKzzE-BXWXAEco0vLzuAKrJT4JjfaBKo-MCbjowqbhn4GTb5L3d0m1g6eVHZiDs3uWza1XABTpjIo2Vo%2526sig%253DCg0ArKJSzHNgD76uoJJREAE%2526urlfix%253D1%2526adurl%253D&ftOBA=1&ftExpTrack=&cachebuster=1319094761
- Requested by
- Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
205.185.216.10
Phoenix, United States,
ASN20446
(HIGHWINDS3 - Highwinds Network Group, Inc., US),
- Reverse DNS
- map2.hwcdn.net
- Software
-
prod-xre-app6.frk11 /
- Resource Hash
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 4C05
|
77 KB
28 KB
|
46ms
39ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 7a9c057de0f641b2b9a094f9f198598b1130ae5e4c92a2fe7bc6a9df1fe5ec3a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 4C05
|
0
61 B
|
29ms
22ms
|
Image
image/gif |
216.58.208.34
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuZLqiHLaWyXNwkcdBLLaikn15sTR1oQp4ti_wFdv0SzZx8Aq5cqo76dN-y4XljT_4UH8PAoChekbpMggM97O_TXxoUw-BOVhOUpZ-1nBkpdacDcOOBg6S_r-B4hZcp0QBD7EOCm0AfKXrtTyl7Nv7Tg6hOJ775DgjV6yRwb5M8k_3ax7pOa-XgrvtTkdKSFeVfEX2tVtkW6muIiNIs2q4eaGI-ckdw_AG8P53CuSHgzucTCErVUnAvO_h14-wguAe0AV7F-9EBGzfpMUic8OvQ0xfK2oCgT8M4RnTTAu4&sai=AMfl-YTcu6Dv281Yg0Q4y1Gh6WEF2juOwgamlWlrqNFHBNVmeuXyOg_hkQF2HSlY_HAFkTuAziz0U6c6EM0FHb03K-tbqT7dUaaZ9kmiQvS_AOfWRdRoVWWIj3Za6Zw&sig=Cg0ArKJSzN8Du18JNeH-EAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
216.58.208.34
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s12-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
106ms
104ms
|
XHR
application/json |
52.216.10.45
Amazon.com
|
|
General
- Full URL
- https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=8044205462
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.216.10.45
Ashburn, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- s3-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H/1.1
|
200
OK
|
homadclienthttpsle-json.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
291 B
682 B
|
16ms
15ms
|
XHR
application/json |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
General
- Full URL
- https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php?cache=6895783431
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a00:13c8:f5::f:4b3d:175
, Germany,
ASN25291
(SYSELEVEN SysEleven GmbH, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-31/html/
Frame A7C4
|
0
0
|
11ms
5ms
|
Document
text/html |
2a00:1450:4001:819::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-31/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
Frame 0498
|
40 KB
0
|
41ms
41ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/tag/js/gpt.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 7f4c79ef3b9ad8186e44d5f06491aa0947af98f0e68c07708f900f57a5f2e141
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
pubads_impl_2019020401.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 0498
|
181 KB
0
|
42ms
40ms
|
Script
text/javascript |
216.58.208.34
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame 0498
|
113 B
175 B
|
25ms
18ms
|
Script
application/javascript |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
- Requested by
- Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:81b::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 0498
|
329 B
298 B
|
89ms
88ms
|
Script
text/javascript |
216.58.208.34
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1899702628101349&correlator=4022019929479831&output=json_html&callback=googletag.impl.pubads.setPassbackAdContents&impl=s&eid=21061742%2C21063144%2C21063137&vrg=2019020401&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-31&iu=%2F53015287%2Fgolem.de_d_970x250_2_dc&sz=770x251%7C800x251%7C970x251%7C20x10%7C30x10%7C40x10%7C80x10%7C100x10&scp=adslot%3Dbillboard2%26src%3Dsdg&eri=6&cookie=ID%3D7d858f55e451bd6e%3AT%3D1549653848%3AS%3DALNI_MbR-VLuzBQBJcfgrnGBaysEdU7OBg&cdm=www.golem.de&bc=15&lmt=1549653849&dt=1549653849387&dlt=1549653848716&idt=651&ea=0&frm=23&biw=1585&bih=1200&isw=770&ish=251&oid=3&adk=3767186536&uci=u6lyhn2kwuia&ifi=1&ifk=158203207&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=6&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1098985837&ga_fc=true&fws=2
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
216.58.208.34
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s12-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 85bc560d0c69e06ee6b1bdb1cce58694b6fc19ca7598068158ff7a4de3d3c6d8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
pubads_impl_rendering_2019020401.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 0498
|
64 KB
0
|
46ms
45ms
|
Script
text/javascript |
216.58.208.34
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
216.58.208.34
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s12-in-f2.1e100.net
- Software
-
sffe /
- Resource Hash
- 95b19c951f8010a75196c9ef97e9ed4ac0bef10221a0e28f18441a29a5a4552b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-31/html/
Frame 0498
|
0
0
|
6ms
5ms
|
Other
text/html |
2a00:1450:4001:819::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-31/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 0498
|
77 KB
28 KB
|
41ms
40ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 7a9c057de0f641b2b9a094f9f198598b1130ae5e4c92a2fe7bc6a9df1fe5ec3a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-31/html/
Frame 729D
|
0
0
|
9ms
5ms
|
Document
text/html |
2a00:1450:4001:819::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-31/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 0498
|
0
61 B
|
27ms
24ms
|
Image
image/gif |
216.58.208.34
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstyS7Aozb6hVg13bCeMHZR9jKY8reQxJelgvj7kFFLff1-Wu3L2zMLCTAHPo8GW6qDObxCM5zCKvqc_tbMkb4nPA9m3LK1-ycNGIW1b9nxUlOFXPhHUzwmyg8B0HxfORd1XQRRrD9nrpDXr92-ruPKBu8gV6_VmtQzbUnMly_6YUFzC5llleiyxcJ9r4czdhFgVOwv0yOWdgsbjjEfLvvUANyd3OBryMercJ5-mz0yoqTovX0KGDv3gFxJjhf-WYG2zdG2XVFHyyzaPGcqr&sai=AMfl-YS6B4NQ4PFxVo-YSPj8aCVlywSb3XxWtxfBdHvWr8w1WzB9BOkO8J3LBSC4MLHJPo0Aldq9RVuu6KH018VCFMTWtLL6ljvcfnvhyjvrE24vN7l_LNiee_tuXLM&sig=Cg0ArKJSzKhw6gF6XZ9nEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
216.58.208.34
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s12-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
333 B
1000 B
|
13ms
11ms
|
XHR
application/json |
54.230.93.94
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=6307809423
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
54.230.93.94
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-54-230-93-94.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- a62742217173c543ccb355b781152fef0e53f4eebd0fd6163be3004955a8beca
|
GET
H/1.1
|
200
OK
|
data
lb65.s400.meetrics.net/
|
43 B
308 B
|
31ms
27ms
|
Image
image/gif |
136.243.3.97
HETZNER-AS
|
|
General
- Full URL
- https://lb65.s400.meetrics.net/data?/rkiFDHYAAKktFLkqFFlqwF23A52AwwALl1FDK2mFLkqFKlkyB23A52AwwA2qoFx1A05A21Az4A03AzxAyyA4yEjrFnmF3yF0BF/k0FAEmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F9yA41A20A41A1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zA55AxzA21AymAjpFk9BxzA4yA14A01A1zA20AmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF90A5zA55AxzA21AymAhwFk9B05Az5A5xAz2A1yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FLlnFBTkzF8PhGAAZAwSAcAAAAPeRAAAAAAABQnBAPCAAFAAQnBTPraAPAAAFAAQnBTNJgASksFkEjAAAAAAAAAAAAEAAAQnBAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFGA3yA44E5wAMAxzA4yA14A01A1zA20AGAkpFylFj0FAAAAIAy4A12A04A11AKA05Az5A5xAz2A1yAGAihFuuFlyFKA05Az5A5xAz2A1yAKA05Az5A5xAz2A1yA0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFQtjFsD7AUA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.97
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h222.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb65.s400.meetrics.net/
|
43 B
308 B
|
31ms
26ms
|
Image
image/gif |
136.243.3.97
HETZNER-AS
|
|
General
- Full URL
- https://lb65.s400.meetrics.net/data?/rkiFEJYAATkzFoZDAAOA55A55A85B55A58E55A55AEA22Aw4ArPraASksF2Td/IAAAAYLAaBAFAAAPraAAAnMo0F0wFz6BvvAzlFy2FlkFi5FumEshFzoF0hFsrFpuFnuBjvFtvBptFwvByvAxwAzzA45A7zA14A25Ax2A7yAwxA7qEzpFmyFhtFl7BC1FzpFulFzzFBkFEFF72EwxAwzADQFNNFp0F0lFszF0hFukFzjFohFuuFlsFC1FzpFulFzzFHpFyvFXQFChFuuFlyF44FhsF3hF5zFvuF44F44F44F44F4vB/mE0fFj1Fz0FvtF9mAptFhnFlUF5wFl9BnpFmmBm0FElFz0FJEF9yAyyA54Ay5AymAm0Ff3FpkF0oF93Ay4AmmE0fFolFpnFo0F95AwmAjsFpjFr9Bo0F0wFz6BvvAhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0vBwjFzvBjsFpjFrlBy1AzGE4hFplBy1AzEEBLFBPFqzF24F0LEUtFarFSCF5zAWhFHKFT2FXwFOzBknFUwBstB3DEtIF3xAP3B4uErVFq0FrGFOQFfRFNQFQIFNTFEOFkZFVtBvzBptFyxBi0FSqFwIFEBFwBFn2B41FtrF4rF1KETpFZnFxEEpJF2DF6PF5ZFT3Fn5FVFFxnEt1A0RE6hF2zEw0EonFz0B2jFwtF4YEnoF2hFKuFIWFKWFHyBfBFMlFphF64FPEFIWFy2E4JEyVEL2Bu6FW4FL1FQ2F5mEsrFRxBWVFPMFRDF0iEoPFxTFTsFDpF0ZFIKFH5FQ6FYpFQiFFzBhQFitFsLFz3A56FGsFGPFiQFk1BDHFC3FY5BRuFwCF0rEGwFiBFyjFmUFtNFMFFuaFkSF3tE1XEwxApCF0PFT1F52A6RFk3FGJFlyA1yA2zEhpFlyA1zAEBFNmFstBZTFntBz1A45B2WFUOF5jExqFKtBtaE2IFQIFsFFhPFQ2BS5BEDFZQFHXFiwFt0BQLF66FFtBCYFXYFBFFjvFw2EM6F1BFLyFKUF0KEqmFhCFLvFtNEDiFqvF3xFioFu0BHUFi1BMzBkwBtxBn2BlWFIaFpEFzzB1XF6hFxYEBCFUwFqJFvyBWvFlyA1yA2zEpnFlyA1zAEDFnwBByFLKFT6FIOFnEF32A1vFKKFSFFBFFlyA1yA21EysFmpF4lBy1AzEExlAy1Ay2AhkF1yFslBy1AzEEmmE0PFCBF9xAmmE0FF4wFUyFhjFr9BmjEhjFolFi1Fz0FlyF9xAzxA5wA50A32AxBEJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjFbvthWA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.97
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h222.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
POST
H2
|
200
|
hb2.php
Show response
tracking.yieldlove-ad-serving.net/
|
2 B
107 B
|
55ms
13ms
|
XHR
text/plain |
52.28.163.57
Amazon.com
|
|
|
POST
H2
|
200
|
hb2.php
Show response
tracking.yieldlove-ad-serving.net/
|
2 B
107 B
|
39ms
14ms
|
XHR
text/plain |
52.28.163.57
Amazon.com
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.golem.de/a64170e53bfb225963dd055fcad1d7bd8b25b42a/
|
333 B
1 KB
|
1893ms
44ms
|
XHR
application/json |
148.251.131.55
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.golem.de/a64170e53bfb225963dd055fcad1d7bd8b25b42a/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.131.55
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.55.131.251.148.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- a62742217173c543ccb355b781152fef0e53f4eebd0fd6163be3004955a8beca
|
GET
H2
|
200
|
bridge3.277.1_de.html
imasdk.googleapis.com/js/core/
Frame 036A
|
0
0
|
7ms
6ms
|
Document
text/html |
2a00:1450:4001:808::200a
Google LLC
|
|
General
- Full URL
- https://imasdk.googleapis.com/js/core/bridge3.277.1_de.html
- Requested by
- Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:808::200a
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
client.js
Show response
s0.2mdn.net/instream/video/
|
26 KB
11 KB
|
95ms
45ms
|
Script
text/javascript |
2a00:1450:4016:80d::2006
Google LLC
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 0498
|
211 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb65.s400.meetrics.net/
|
43 B
308 B
|
18ms
18ms
|
Image
image/gif |
136.243.3.97
HETZNER-AS
|
|
General
- Full URL
- https://lb65.s400.meetrics.net/data?/rkiFFScAAUkzFRCZDAAOA55A55A85B55A58E55A55AEA22Aw4ArNJgAPAAA+95AAAjPraAPAAAAAAAAATPraAPAAA+95AAAjNJgAPAAAAAAAAATNJgAPAAAFAAQnBT+95APTBA/IAAAAHPraAPBAAXUAAAAHNJgASksFCVdXUAAAAIDAYJAFAAANJgAAAlMo0F0wFz6BvvAzlFy2FlkFi5FumEshFzoF0hFsrFpuFnuBjvFtvBptFwvByvAxwAzzA45A7zA14A25Ax3A7yAwxA7qEzpFmyFhtFl7BC1FzpFulFzzFBkFEFF72EwxAwzADQFNNFp0F0lFszF0hFukFzjFohFuuFlsFC1FzpFulFzzFHpFyvFXQFTrF54F4hFs3Fh5FzvFu4F44F44F44F44Fv/Am0FfjF1zF0vFt9BmpEthFnlFU5FwlF9nEpmFmmE0EFlzF0JFE9ByyAy5A4yA5zAmmE0fF3pFk0Fo9BywAwmAm0FfoFlpFnoF09B2wAwmAjsFpjFr9Bo0F0wFz6BvvAhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0vBwjFzvBjsFpjFrlBy1AzGE4hFplBy1AzEEBLFBPFqzF24F0LEUtFarFSCF5zAWhFHKFT2FXwFOzBknFUwBstB3DEtIF3xAP3B4uErVFq0FrGFOQFfRFNQFQIFNTFEOFkZFVtBvzBptFyxBi0FSqFwIFEBFwBFn2B41FtrF4rF1KETpFZnFxEEpJF2DF6PF5ZFT3Fn5FVFFxnEt1A0RE6hF2zEw0EonFz0B2jFwtF4YEnoF2hFKuFIWFKWFHyBfBFMlFphF64FPEFIWFy2E4JEyVEL2Bu6FW4FL1FQ2F5mEsrFRxBWVFPMFRDF0iEoPFxTFTsFDpF0ZFIKFH5FQ6FYpFQiFFzBhQFitFsLFz3A56FGsFGPFiQFk1BDHFC3FY5BRuFwCF0rEGwFiBFyjFmUFtNFMFFuaFkSF3tE1XEwxApCF0PFT1F52A6RFk3FGJFlyA1yA2zEhpFlyA1zAEBFNmFstBZTFntBz1A45B2WFUOF5jExqFKtBtaE2IFQIFsFFhPFQ2BS5BEDFZQFHXFiwFt0BQLF66FFtBCYFXYFBFFjvFw2EM6F1BFLyFKUF0KEqmFhCFLvFtNEDiFqvF3xFioFu0BHUFi1BMzBkwBtxBn2BlWFIaFpEFzzB1XF6hFxYEBCFUwFqJFvyBWvFlyA1yA2zEpnFlyA1zAEDFnwBByFLKFT6FIOFnEF32A1vFKKFSFFBFFlyA1yA21EysFmpF4lBy1AzEExlAy1Ay2AhkF1yFslBy1AzEEmmE0PFCBF9xAmmE0FF4wFUyFhjFr9BmjEhjFolFi1Fz0FlyF9xAzxA5wA50A32AxBEJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAd/IAAAAgOAYJAFAAA+95AOAxwA5yA2zAfxBzxA22AxfEAAJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjFtnzwXA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.97
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h222.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb65.s400.meetrics.net/
|
43 B
308 B
|
16ms
16ms
|
Image
image/gif |
136.243.3.97
HETZNER-AS
|
|
General
- Full URL
- https://lb65.s400.meetrics.net/data?/rkiFGA1AA/k0FKImvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F9yA41A20A41A1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zA55AxzA21AymAjpFk9BxzA4yA14A01A1zA20AmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF90A5zA55AxzA21AymAhwFk9B05Az5A5xAz2A1yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay1A41A3zA54A4mAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FLlnFCUkzFYBPzCAAAAAAABduzAPBAAFAAduzTbosAZBAAOA55A55A85B55A58E55A55AGAyxAx4A25ArbosAP5BAYGAUTAHbosASksFwFjAAAAAAAAAAAAEAAAduzAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA33Aw4Ey1AxBEMAxzA4yA14A13Az5A44AGAkpFylFj0FAAAAJA25Aw1Ax1A13A1BEKA04A5wAz3Az0Ay0AKAipFssFivFhyFkyBKA04A5wAz3Az0Ay0AKA04A5wAz3Az0Ay0A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBdYGAUTACMA7DAFAAAbosAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFd6MNWA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.97
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h222.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb65.s400.meetrics.net/
|
43 B
308 B
|
18ms
17ms
|
Image
image/gif |
136.243.3.97
HETZNER-AS
|
|
General
- Full URL
- https://lb65.s400.meetrics.net/data?/rkiFHB1AA/k0FDMmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F9yA41A20A41A1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zA55AxzA21AymAjpFk9BxzA4yA14A01A1zA20AmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF90A5zA55AxzA21AymAhwFk9B05Az5A5xAz2A1yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay1A41A3zA54A4mAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0BFLlnFDTkzFeP0WAAAAAAABJsxAPAAAFAAJsxT1ZoASksFSEjAAAAAAAAAAAAEAAAJsxAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEEAu1FssFKAHvFvnFslFgBEkYFAAAAIAzzA3wA5zA31AEAu1FssFKAylFj0FhuFnsFlyBEAu1FssFEAu1FssF4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBQtjF5uu+XA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.97
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h222.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.golem.de/
|
24 B
281 B
|
74ms
13ms
|
Script
application/octet-stream |
148.251.0.183
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.0.183
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.183.0.251.148.clients.your-server.de
- Software
-
openresty/1.13.6.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 76A1
|
241 B
0
|
|
Script
text/javascript |
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.golem.de/f0f311700cc43cbf042dc467a06b572684b096cb/
|
110 B
672 B
|
94ms
18ms
|
XHR
application/json |
148.251.131.55
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.golem.de/f0f311700cc43cbf042dc467a06b572684b096cb/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.131.55
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.55.131.251.148.clients.your-server.de
- Software
-
TornadoServer/4.5.3 /
- Resource Hash
- 9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
|
GET
H/1.1
|
200
OK
|
Cookie set
showad.js
ads.pubmatic.com/AdServer/js/
Frame BED3
|
0
0
|
152ms
21ms
|
Document
text/html |
2.18.233.180
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame 7F76
|
0
0
|
143ms
19ms
|
Document
text/html |
2.18.232.130
Akamai Technologies
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.130
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-130.deploy.static.akamaitechnologies.com
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H2
|
200
|
pd
eu-u.openx.net/w/1.0/
Frame B1C2
|
0
0
|
79ms
59ms
|
Document
text/html |
173.241.240.143
OPENX TECHNOLOGIES
|
|
General
- Full URL
- https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, CHACHA20_POLY1305
- Server
-
173.241.240.143
New York, United States,
ASN36089
(OPENX-AS1 - OPENX TECHNOLOGIES, INC., US),
- Reverse DNS
- ox-173-241-240-143.xa.dc.openx.org
- Software
-
OXGW/16.121.0 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
data
lb65.s400.meetrics.net/
|
43 B
308 B
|
55ms
12ms
|
Image
image/gif |
136.243.3.97
HETZNER-AS
|
|
General
- Full URL
- https://lb65.s400.meetrics.net/data?/rkiFINOBATkzF6ZBAAOA55A55A85B55A58E55A55AGAywAz1Ay5Ar1ZoAPrAAhPAqABH1ZoASksFsCdhPAqABtEA6DAFAAA1ZoAAAGBo0F0wFz6BvvA0wFjuBnvFvnFslFz5FukFpjFh0FpvFuuBjvFtvBzhFmlFmyFhtFlvBxtAwtAzxAvoE0tFsvBjvFu0FhpFulFyuBo0FtsFPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFMecXSA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.97
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h222.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb65.s400.meetrics.net/
|
43 B
308 B
|
14ms
13ms
|
Image
image/gif |
136.243.3.97
HETZNER-AS
|
|
General
- Full URL
- https://lb65.s400.meetrics.net/data?/rkiFJh3BA/k0F6PmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F9yA41A20A41A1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zA55AxzA21AymAjpFk9BxzA4yA14A01A1zA20AmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF90A5zA55AxzA21AymAhwFk9B05Az5A5xAz2A1yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay1A41A3zA54A4mAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mFvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29BzzA3wA5zA31AmjEwpFk9BklFzrF0vFwmBhwFh9Bu1FssFmjEpkF9uE1sFsmBzpF6lF9zAwwA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BHvFvnFslFgBEkYFmtEtvFklF9kElmFh1Fs0FLlnFETkzFARksFAQtjFT/XmYA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.97
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h222.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
88ms
18ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/607/2256/s/
|
39 KB
14 KB
|
40ms
39ms
|
Script
application/javascript |
89.163.159.117
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1014 B
|
255ms
51ms
|
Script
application/javascript |
62.168.44.119
GTSCE GTS Central...
|
|
|
GET
H/1.1
|
200
OK
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
137ms
35ms
|
Script
text/javascript |
52.31.228.50
Amazon.com
|
|
|
GET
H/1.1
|
200
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
673 B
|
55ms
9ms
|
Image
image/gif |
18.185.67.216
Amazon.com
|
|
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.1/
|
4 KB
2 KB
|
65ms
17ms
|
Script
application/javascript |
2600:9000:200d:cc00:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
33ms
32ms
|
Script
text/javascript |
52.31.228.50
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=0&screen=1200x1600&mbr=e9f7e30eaec7a49a8083ef2bc5e6e500&event_id=page_view&_sid=69511&_ver=0.2.1&_seg=jsonp&_=341129062737
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.1/p.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.31.228.50
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-31-228-50.eu-west-1.compute.amazonaws.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
- 81cbcad7932114f5a824b65988df6327356a6124528e4d76e1ac4b54e887805b
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
162ms
51ms
|
Script
application/javascript |
34.252.169.181
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
usersync
uss.xplosion.de/
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa8ESw0BsJ0WsU8Eif-BiUABifkBSfZWsfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://xpl.theadex.com/d/327/i/2.gif?_sc=1001819792024170135&axd_pid=22&axd_fuid=BSa8ESw0BsJ0WsU8Eif-BiUABifkBSfZWsfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3...
-
https://uss.xplosion.de/usersync?sid=65966&fpid=1001819792024170135
|
42 B
832 B
|
160ms
32ms
|
Image
image/gif |
34.254.7.51
Amazon.com
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
140 B
210 B
|
71ms
22ms
|
Script
text/plain |
89.163.159.125
MYLOC-AS
|
|
General
- Full URL
- https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
- Requested by
- Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
89.163.159.125
Hattersheim, Germany,
ASN24961
(MYLOC-AS, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 034d63d5ae8dd718e7a38bbd336fae2ae8bd1dd02baf156a49e60921ae40c7fe
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame AC3D
|
0
0
|
151ms
33ms
|
Document
text/html |
52.208.127.173
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
usersync
uss.xplosion.de/
|
42 B
832 B
|
33ms
33ms
|
Image
image/gif |
34.254.7.51
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
135ms
40ms
|
XHR
text/javascript |
95.216.24.148
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:time[url:%2F,site_skin:desktop,device:desktop,custom_page_type:Home%20page,cdn_version:6]&s=6acc7c777cce3be138a245218c439c54&1549653858613
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
95.216.24.148
, Ukraine,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.148.24.216.95.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|