GET
H/1.1
|
200
OK
|
Primary Request
Cookie set
/
Show response
www.golem.de/
Redirect Chain
-
http://golem.de/
-
https://www.golem.de/
|
168 KB
169 KB
|
102ms
43ms
|
Document
text/html |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_114-min.css
www.golem.de/staticrl/styles/
|
73 KB
20 KB
|
55ms
19ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
iqd_gzip_test.js.gz
Show response
iqdtms.golem.de/
|
23 B
491 B
|
168ms
102ms
|
Script
application/x-gzip |
77.247.84.128
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
logo-g.png
www.golem.de/staticrl/images/
|
4 KB
4 KB
|
49ms
17ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136713-174463-174459_rc.jpg
www.golem.de/1809/
|
13 KB
13 KB
|
52ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136695-174400-174396_rc.jpg
www.golem.de/1809/
|
9 KB
9 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136714-174471-174467_rc.jpg
www.golem.de/1809/
|
8 KB
8 KB
|
22ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136625-174252-174249_rc.jpg
www.golem.de/1809/
|
7 KB
7 KB
|
35ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136686-174370-174369_rc.jpg
www.golem.de/1809/
|
3 KB
3 KB
|
36ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
67ms
16ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
iphonexmax-snap.jpg
video.golem.de/teaser/1/1/21844/thumb-high-1000/
|
40 KB
41 KB
|
66ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gopro-hero-7-trailer.jpg
video.golem.de/teaser/1/1/21838/thumb-high-1000/
|
133 KB
133 KB
|
61ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136668-174279-174275_rc.jpg
www.golem.de/1809/
|
132 KB
133 KB
|
21ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136615-174046-174045_rc.jpg
www.golem.de/1809/
|
61 KB
61 KB
|
26ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
61ms
15ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_114-min.js
Show response
www.golem.de/staticrl/scripts/
|
100 KB
41 KB
|
22ms
21ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
longread-swiper_122-min.js
Show response
www.golem.de/staticrl/scripts/
|
2 KB
1 KB
|
18ms
16ms
|
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
|
20ms
18ms
|
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
|
80ms
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/
|
26 KB
9 KB
|
35ms
10ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H/1.1
|
200
OK
|
iqadcontroller.js.gz
Show response
iqdtms.golem.de/cdn_golem_dt/live/
|
196 KB
52 KB
|
130ms
129ms
|
Script
text/javascript |
77.247.84.128
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
|
20 KB
8 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
|
GET
S
|
200
|
imgad
Show response
tpc.googlesyndication.com/pagead/
|
25 B
174 B
|
7ms
6ms
|
Script
application/x-javascript |
2a00:1450:4001:81f::2001
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
yield.js
Show response
z.moatads.com/iqdigitaldfpprebidheader645711382528/
|
98 KB
30 KB
|
11ms
10ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
S
|
200
|
prebid29082018.js
Show response
dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/
|
101 KB
32 KB
|
29ms
8ms
|
Script
application/javascript |
2600:9000:200c:4a00:1:9777:c740:21
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
apstag.js
Show response
c.amazon-adsystem.com/aax2/
|
58 KB
17 KB
|
39ms
20ms
|
Script
application/javascript |
143.204.96.211
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
default.js
Show response
ups.xplosion.de/loader/97578/
Redirect Chain
-
https://dyn.emetriq.de/loader/97578/default.js
-
https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
|
2 KB
2 KB
|
112ms
26ms
|
Script
text/javascript |
34.251.222.238
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
launch-EN92e1075482f3410d81944270acba8d90.min.js
Show response
assets.adobedtm.com/
|
131 KB
42 KB
|
33ms
16ms
|
Script
application/x-javascript |
2.18.232.23
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
adex.js
Show response
dmp.theadex.com/d/494/1428/s/
|
39 KB
14 KB
|
64ms
14ms
|
Script
application/javascript |
89.163.159.101
MYLOC-AS
|
|
|
GET
S
|
200
|
vis.js
Show response
d1pywvbolq0b04.cloudfront.net/iqdvis/golem/
|
1 KB
831 B
|
35ms
8ms
|
Script
text/javascript |
2600:9000:200c:6800:1c:9fd1:6d00:21
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
26033,26034,26035,660053,660071,660107,660089,5108423,464839
Show response
ad.yieldlab.net/yp/
|
154 B
707 B
|
32ms
16ms
|
Script
text/javascript |
2.18.232.233
Akamai Technologies
|
|
General
- Full URL
- https://ad.yieldlab.net/yp/26033,26034,26035,660053,660071,660107,660089,5108423,464839?ts=1537549837483&yl_rtb_pubkey=21719_golem
- 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
-
2.18.232.233
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-233.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8
|
GET
H/1.1
|
200
OK
|
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
|
22 KB
22 KB
|
17ms
16ms
|
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
|
18ms
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
|
18ms
18ms
|
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
H/1.1
|
200
OK
|
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
|
20 KB
20 KB
|
17ms
16ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
153 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
147 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
126 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
H/1.1
|
200
OK
|
yi.js
Show response
mb.moatads.com/
|
2 KB
2 KB
|
148ms
87ms
|
Script
text/html |
18.130.208.27
Amazon.com
|
|
General
- Full URL
- https://mb.moatads.com/yi.js?ud=false&ue=false&uu=false&qm=0&qn=(%2BIb%7Cj8o%3FJ(jkkeL07ta_*JRM!6t9B%2CN%3Ey)%2ChXbvU37_*NhSfBghz%5D*vOJ%23_%3DNoUA%5DRgBU_Gr1%3E%3AHuFTn%3ADXqJHZ%3BR%23yAb%2Bho8bYLaXBjA%3AmQ)%3CF!tAbjrzJ%3BgoVYGVxc%40lQQV%23tc3%2Fh%7C%3FVKV%3BW5.NO)Wx%7C*E%24%3D!L2ux%7Ci_lOfxECSR23_hFAkD%3Dv%3CN%5B.%22%24b_o%3FtVD%5D%5BpN%7CQF%40Sy7%7BA&qp=00000&qq=000000000000&qr=0&is=voqBBkBBBBHhBBwBBZkJjBRCqUCY3CTCB6BXwUcu8gKCBS9lYBBBCCBpYFmR4BOZBBgSJTcBBBBBBBBHUoKOFCyz7BB3CZ6mv5TimBBe9oeCt9lXqBvBCfBBBBBBBBBBBBBBCBMBaBeBBkKzQClBeaKaMVMBj5iMPzyHVY9zqxknZlysGxCBcBBBC9CctORpnICyRBBB4OBBBBBBBBBBC9TiFF3dOKBCBBxBBBBBBBfBz1BD7fB3BpkBJUDyDCZ6IDDDCCCCDDCCCCCCCBdh2eBBBGI79kNB8DJoDBBBBCiBBiB&iv=6&gz=0&hh=0&hn=0&qt=0&tw=null&url=https%3A%2F%2Fwww.golem.de%2F&confidence=2&pcode=iqdigitaldfpprebidheader645711382528&callback=MoatNadoAllJsonpRequest_37456155
- Requested by
- Host: z.moatads.com
URL: https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yield.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
18.130.208.27
Cambridge, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-18-130-208-27.eu-west-2.compute.amazonaws.com
- Software
-
nginx/1.7.9 /
- Resource Hash
- 2fb187e8f47fb77123e5e541c8671d60215d35b6f108207066571a96ae4767c7
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
19ms
5ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=17&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&na=945230957&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
- Protocol
- SPDY
- 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
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:81b::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
- SPDY
- 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
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
pubads_impl_249.js
Show response
securepubads.g.doubleclick.net/gpt/
|
182 KB
63 KB
|
41ms
40ms
|
Script
text/javascript |
172.217.22.98
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
918034,918035,918036,918038,918037,918039,918040,5196623,918310
Show response
ad.yieldlab.net/yp/
|
154 B
707 B
|
55ms
54ms
|
Script
text/javascript |
2.18.232.233
Akamai Technologies
|
|
General
- Full URL
- https://ad.yieldlab.net/yp/918034,918035,918036,918038,918037,918039,918040,5196623,918310?ts=1537549837483&yl_rtb_pubkey=781119_golem
- 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
-
2.18.232.233
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-233.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8
|
GET
H/1.1
|
200
OK
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
7 KB
|
23ms
9ms
|
XHR
application/javascript |
143.204.96.211
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
bid
Show response
aax.amazon-adsystem.com/e/dtb/
|
47 B
341 B
|
132ms
48ms
|
XHR
text/javascript |
52.94.216.48
Amazon.com
|
|
General
- Full URL
- https://aax.amazon-adsystem.com/e/dtb/bid?src=3711&u=https%3A%2F%2Fwww.golem.de%2F&pid=3696452289371537549837621&cb=8226656074431537549837624&ws=1600x1200&v=7.16.00&t=2000&slots=%5B%7B%22sd%22%3A%22iqadtile1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile1%22%7D%2C%7B%22sd%22%3A%22iqadtile16%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22728x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile16%22%7D%2C%7B%22sd%22%3A%22iqadtile3%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile3%22%7D%2C%7B%22sd%22%3A%22iqadtile4%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%2C%22970x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile4%22%7D%2C%7B%22sd%22%3A%22iqadtile5%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%2C%22970x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile5%22%7D%2C%7B%22sd%22%3A%22iqadtile8%22%2C%22s%22%3A%5B%22300x300%22%2C%22300x600%22%2C%22300x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile8%22%7D%2C%7B%22sd%22%3A%22iqadtile9%22%2C%22s%22%3A%5B%22300x300%22%2C%22300x600%22%2C%22300x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile9%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.94.216.48
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
- ac07abc3fc5a450ec41a5a82ffdd347c94ea88ceeb8f3d5ab322601375b9ff07
|
POST
H/1.1
|
204
No Content
|
cdb
Show response
bidder.criteo.com/
|
0
186 B
|
85ms
22ms
|
XHR
text/plain |
178.250.2.89
ASN-CRITEO-EUROPE
|
|
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
21 B
711 B
|
38ms
13ms
|
XHR
application/json |
185.33.223.204
AppNexus
|
|
|
GET
H/1.1
|
200
OK
|
id
Show response
dpm.demdex.net/
|
1 KB
1 KB
|
123ms
31ms
|
XHR
application/json |
54.194.25.183
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
5ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=0&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=0&zMoat_YI1=0&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1695835591&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
73 KB
27 KB
|
22ms
22ms
|
Script
text/javascript |
2a00:1450:4001:812::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
|
17ms
17ms
|
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/
|
124 B
492 B
|
15ms
15ms
|
Script
application/javascript |
2a00:13c8:f5::f:4b3d:17a
SYSELEVEN SysElev...
|
|
|
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&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011dd71c5dc0c4b75ba5260d&ep=1563766613&vr=409&id=s9k4qs<=1537...
-
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011dd71c5dc0c4b75ba5260d&ep=1563766613&vr=409&id=s9k4qs<=1537...
|
0
694 B
|
9ms
9ms
|
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&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011dd71c5dc0c4b75ba5260d&ep=1563766613&vr=409&id=s9k4qs<=1537549837796&ev=&cs=kh9di0&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.04.6 0023
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
IjvnOpbzskTW
Show response
cdn.onthe.io/io.js/
|
51 KB
16 KB
|
38ms
11ms
|
Script
text/javascript |
165.227.149.77
DigitalOcean
|
|
|
GET
S
|
200
|
ga.js
Show response
www.google-analytics.com/
|
45 KB
17 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:820::200e
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
RCebdd9841332744f18b2789656c4ca942-source.min.js
Show response
assets.adobedtm.com/BLed89b775744045ef81153791afe11bfc/
|
457 B
746 B
|
6ms
5ms
|
Script
application/x-javascript |
2.18.232.23
Akamai Technologies
|
|
|
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
|
18ms
17ms
|
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
|
17ms
17ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
vlcsnap-2018-09-19-12h22m54s272.jpg
video.golem.de/teaser/1/1/21828/thumb-high-1000/
|
101 KB
101 KB
|
17ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
2080series-snap.jpg
video.golem.de/teaser/1/1/21808/thumb-high-1000/
|
108 KB
108 KB
|
17ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
reflectionsdemo-snap.jpg
video.golem.de/teaser/1/1/21824/thumb-high-1000/
|
106 KB
106 KB
|
46ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
captain-marvel-trailer.jpg
video.golem.de/teaser/1/1/21817/thumb-high-1000/
|
56 KB
56 KB
|
47ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136712-174458-174455_rc.jpg
www.golem.de/1809/
|
7 KB
7 KB
|
20ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136709-174441-174437_rc.jpg
www.golem.de/1809/
|
9 KB
9 KB
|
21ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136711-174454-174451_rc.jpg
www.golem.de/1809/
|
3 KB
4 KB
|
20ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136663-174223-174220_rc.jpg
www.golem.de/1809/
|
5 KB
6 KB
|
16ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136649-174174-174171_rc.jpg
www.golem.de/1809/
|
9 KB
9 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136629-174068-174066_rc.jpg
www.golem.de/1809/
|
69 KB
69 KB
|
16ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136688-174358-174355_rc.jpg
www.golem.de/1809/
|
6 KB
7 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136710-174450-174447_rc.jpg
www.golem.de/1809/
|
7 KB
7 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136664-174227-174224_rc.jpg
www.golem.de/1809/
|
8 KB
8 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136707-174432-174429_rc.jpg
www.golem.de/1809/
|
6 KB
6 KB
|
17ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136680-174321-174318_rc.jpg
www.golem.de/1809/
|
8 KB
8 KB
|
16ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136708-174436-174433_rc.jpg
www.golem.de/1809/
|
9 KB
10 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136667-174239-174236_rc.jpg
www.golem.de/1809/
|
5 KB
6 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
134463-163375-163372_rc.jpg
www.golem.de/1805/
|
10 KB
10 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136655-174179-174176_rc.jpg
www.golem.de/1809/
|
5 KB
6 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136704-174426-174423_rc.jpg
www.golem.de/1809/
|
5 KB
6 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136703-174422-174419_rc.jpg
www.golem.de/1809/
|
7 KB
7 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136685-174346-174343_rc.jpg
www.golem.de/1809/
|
6 KB
6 KB
|
20ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136702-174418-174415_rc.jpg
www.golem.de/1809/
|
4 KB
4 KB
|
20ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136627-174139-174138_rc.jpg
www.golem.de/1809/
|
6 KB
7 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136700-174413-174410_rc.jpg
www.golem.de/1809/
|
8 KB
8 KB
|
17ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136648-174132-174131_rc.jpg
www.golem.de/1809/
|
6 KB
7 KB
|
17ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136699-174408-174405_rc.jpg
www.golem.de/1809/
|
9 KB
10 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136185-173901-173900_rc.jpg
www.golem.de/1809/
|
9 KB
9 KB
|
19ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136683-174341-174339_rc.jpg
www.golem.de/1809/
|
14 KB
14 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136468-173737-173735_rc.jpg
www.golem.de/1809/
|
33 KB
33 KB
|
16ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136593-173920-173918_rc.jpg
www.golem.de/1809/
|
19 KB
19 KB
|
17ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136612-173986-173984_rc.jpg
www.golem.de/1809/
|
16 KB
17 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136564-173779-173777_rc.jpg
www.golem.de/1809/
|
17 KB
17 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136376-173549-173547_rc.jpg
www.golem.de/1809/
|
23 KB
24 KB
|
19ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136584-173857-173855_rc.jpg
www.golem.de/1809/
|
16 KB
16 KB
|
20ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136561-173723-173721_rc.jpg
www.golem.de/1809/
|
24 KB
24 KB
|
20ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136578-173813-173810_rc.jpg
www.golem.de/1809/
|
20 KB
20 KB
|
16ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136523-173784-173782_rc.jpg
www.golem.de/1809/
|
25 KB
25 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136545-173646-173644_rc.jpg
www.golem.de/1809/
|
14 KB
15 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136537-173623-173621_rc.jpg
www.golem.de/1809/
|
22 KB
22 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136541-173633-173631_rc.jpg
www.golem.de/1809/
|
23 KB
24 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136436-173142-173140_rc.jpg
www.golem.de/1809/
|
31 KB
32 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
cpx.php
cpx.golem.de/
|
42 B
420 B
|
63ms
15ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:182
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
22 KB
6 KB
|
57ms
57ms
|
XHR
text/javascript |
172.217.22.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2005241750715003&correlator=90840458499793&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=953563517%2C21061300%2C21062186%2C21062126&vrg=249&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C728x90&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile1%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D1&cookie_enabled=1&bc=7&abxe=1&lmt=1537549837&dt=1537549837853&dlt=1537549837095&idt=682&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=0&adk=242336818&gut=v2&ifi=1&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=67&icsg=2955487960108992&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x-1&msz=1000x-1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&fws=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.22.98
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- d7eed0b77cc69ab1a1c257b93201ef4590e8e4bde79ab53c02d9460edc7bacff
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
pubads_impl_rendering_249.js
Show response
securepubads.g.doubleclick.net/gpt/
|
51 KB
19 KB
|
40ms
40ms
|
Script
text/javascript |
172.217.22.98
Google LLC
|
|
|
GET
S
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-29/html/
|
0
0
|
6ms
6ms
|
Other
text/html |
2a00:1450:4001:81f::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:81f::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
22 KB
6 KB
|
261ms
261ms
|
XHR
text/javascript |
172.217.22.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2005241750715003&correlator=90840458499793&output=json_html&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=953563517%2C21061300%2C21062186%2C21062126&vrg=249&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x333%7C1000x250%7C1000x100%7C970x90%7C940x250%7C970x250%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile3%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D3&cookie_enabled=1&bc=7&abxe=1&lmt=1537549837&dt=1537549837865&dlt=1537549837095&idt=682&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=2638043459&gut=v2&ifi=2&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=68&icsg=2955487960108992&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x10370&msz=99x1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&fws=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.22.98
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- ea8af7f609f871c9bdcda24ffc2763fe0ad8c25dcc9b2374b42abb1e1d8d00c6
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
26 KB
7 KB
|
412ms
412ms
|
XHR
text/javascript |
172.217.22.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2005241750715003&correlator=90840458499793&output=json_html&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=953563517%2C21061300%2C21062186%2C21062126&vrg=249&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x333%7C1000x167%7C1000x125%7C1000x100%7C970x250%7C800x250%7C970x90%7C728x90%7C660x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile16%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D16&cookie_enabled=1&bc=7&abxe=1&lmt=1537549837&dt=1537549837872&dlt=1537549837095&idt=682&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=3736976088&gut=v2&ifi=3&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=68&icsg=2955487960108992&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x418&msz=99x1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&fws=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.22.98
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 2343e09eb2e4a940546c7b87f6ef2d8a69e530c2a62cfb5ea58c33375ef1b8e1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
7ms
6ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=44&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=2116753613&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.1.13/
|
4 KB
2 KB
|
27ms
7ms
|
Script
application/javascript |
2600:9000:200c:1000:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
dest5.html
iqdigital.demdex.net/
Frame 36F8
|
0
0
|
110ms
28ms
|
Document
text/html |
54.194.25.183
Amazon.com
|
|
General
- Full URL
- https://iqdigital.demdex.net/dest5.html?d_nsid=0
- Requested by
- Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
54.194.25.183
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-54-194-25-183.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
|
POST
H/1.1
|
200
OK
|
event
Show response
iqdigital.demdex.net/
|
848 B
2 KB
|
119ms
36ms
|
XHR
application/json |
54.194.25.183
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
ibs:dpid=411&dpuuid=W6UmDgAABqhk7hKk
dpm.demdex.net/
Redirect Chain
-
https://cm.everesttech.net/cm/dd?d_uuid=54935172527602593263077058325949373375
-
https://dpm.demdex.net/ibs:dpid=411&dpuuid=W6UmDgAABqhk7hKk
|
42 B
769 B
|
34ms
31ms
|
Image
image/gif |
54.194.25.183
Amazon.com
|
|
|
GET
S
|
200
|
collect
stats.g.doubleclick.net/r/
Redirect Chain
-
https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1121452614&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=...
-
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=964551683.1537549838&jid=1585770111&_v=5.7.2&z=1121452614
|
35 B
113 B
|
15ms
14ms
|
Image
image/gif |
2a00:1450:400c:c00::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=964551683.1537549838&jid=1585770111&_v=5.7.2&z=1121452614
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:400c:c00::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
|
ibs:dpid=385489&dpuuid=6603726265934215195
dpm.demdex.net/
Redirect Chain
-
https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fdpm.demdex.net%2Fibs%3Adpid%3D385489%26dpuuid%3D%25%25COOKIE%25%25
-
https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6603726265934215195
|
42 B
769 B
|
31ms
31ms
|
Image
image/gif |
54.194.25.183
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
sp_mug0-839065-i_rc.jpg
www.golem.de/5821/
|
68 B
486 B
|
62ms
61ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
14ms
5ms
|
XHR
text/javascript |
88.99.5.37
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,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:7381ac56e.ef59e7f2f_1537549837948,cdn_version:0]&s=6acc7c777cce3be138a245218c439c54&1537549837952
- 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
-
88.99.5.37
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.88-99-5-37.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/uniques/
|
33 B
515 B
|
78ms
25ms
|
Script
text/html |
95.216.24.149
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
19ms
7ms
|
XHR
text/javascript |
88.99.5.37
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,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:7381ac56e.ef59e7f2f_1537549837948,cdn_version:0]&s=6acc7c777cce3be138a245218c439c54&__io=7381ac56e.ef59e7f2f_1537549837948&1537549837955
- 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
-
88.99.5.37
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.88-99-5-37.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
26ms
9ms
|
XHR
text/javascript |
88.99.5.37
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,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:7381ac56e.ef59e7f2f_1537549837948,cdn_version:0]&s=6acc7c777cce3be138a245218c439c54&1537549837957
- 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
-
88.99.5.37
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.88-99-5-37.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
62ms
16ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
ca-pub-2342548244565729.js
Show response
pagead2.googlesyndication.com/pub-config/r20160913/
|
133 B
241 B
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:812::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
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::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/r20180917/r20180604/
Frame 36DA
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20180917/r20180604/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:812::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
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/
Frame 405F
|
196 KB
73 KB
|
26ms
25ms
|
Script
text/javascript |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 6e02736a6f9e93cdfe22ded97de7a301f4633fad2372bfaa40c825ed2500c4a5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
45ms
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
|
43ms
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
|
43ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
rmpslider-rl_122-min.js
Show response
www.golem.de/staticrl/scripts/radiant/
|
16 KB
7 KB
|
20ms
20ms
|
XHR
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
25 KB
8 KB
|
450ms
450ms
|
XHR
text/javascript |
172.217.22.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2005241750715003&correlator=90840458499793&output=json_html&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=953563517%2C21061300%2C21062186%2C21062126&vrg=249&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C300x300%7C300x600%7C300x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile8%2Cvis70801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D8%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1537549838&dt=1537549838072&dlt=1537549837095&idt=682&frm=20&biw=1585&bih=1200&oid=3&adx=993&ady=880&adk=1289509276&gut=v2&ifi=8&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=72&icsg=2955487960108992&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x384&msz=99x1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=true&fws=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.22.98
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 05d54031e10a55e5d508d2ca8d24becb16634bbc1edae0f00a6a3111acd6c5e6
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
22 KB
7 KB
|
678ms
677ms
|
XHR
text/javascript |
172.217.22.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2005241750715003&correlator=90840458499793&output=json_html&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=953563517%2C21061300%2C21062186%2C21062126&vrg=249&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x500%7C1000x333%7C1000x250%7C1000x167%7C1000x125%7C1000x100%7C970x90%7C800x250%7C970x250%7C970x90%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile4%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D4%26m_mv%3D60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1537549838&dt=1537549838084&dlt=1537549837095&idt=682&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=1213&adk=780685045&gut=v2&ifi=9&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=72&icsg=2955487960108992&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x16&msz=99x1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=true&fws=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.22.98
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 060aab0c3898c5312ac10d4ba85cc2b6b9509aa776d58ea1c19bd05710efba1a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
29ms
28ms
|
Script
text/javascript |
34.251.222.238
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&event_id=page_view&_sid=97578&_ver=0.1.13&_seg=jsonp&_=339952935480
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.251.222.238
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-34-251-222-238.eu-west-1.compute.amazonaws.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
- 83c3baeb96c9e8de784e725a4fb9fba02c6b597ef9421512cb9fb653d563e4ea
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/
Frame 545D
|
73 KB
27 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:81f::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:81f::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 939afa865a77f028eab9017820c823d2b8c103c67ac3634d52d98d7a07f8a12a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
imgad
pagead2.googlesyndication.com/pagead/
|
2 KB
3 KB
|
6ms
5ms
|
Image
image/png |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/imgad?id=CICAgIDQ04jCzgEQARgBKAEyCLeTE4Yu5hvQQMa81o0F
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 5b54ebb2ed254f7922b3af74610d4487b245899ac8e4178f4c6553b6781da60a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
osd.js
Show response
pagead2.googlesyndication.com/pagead/
|
72 KB
26 KB
|
5ms
5ms
|
Script
text/javascript |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/osd.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- f4055bd0cdf467ff6940a20d9284a60987a85578033114820b1dc605dbb70991
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 545D
|
0
285 B
|
19ms
19ms
|
Image
image/gif |
172.217.22.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvTSuMLGPK-2ZJiYDBGm16WjzBKKKgji27KJatZ9bcsfjZrw5PUd2uGdA0Kt0OwAC8xrbWV7XerJta1BnaTUrYsz5WN47fGrCDUhPVj6hrVus7s4TGQ5rStfIlPzcKh0J0d76Hk_LtAkb3aeMeBWXVC56Q-uNeFjSG8YKKxrBgsDdEhq_MzalgJNAbS1L69OK1R9JDt54DAZEu16KySaq8q9hsYmSog4Y-31SYuMdlYCuVrSDYZ-w&sai=AMfl-YTpN1YoIXSZfy0SHBZwY-_GulgFQN3nnIAmSIVSR1orVqFUZy4ZYWga_GgB_yaR2GLF6rSXRGP6zseiGlG8IkDYSUJL3ne6b41QrPEg&sig=Cg0ArKJSzCzUylnED-AHEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.22.98
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s18-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
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
5ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile1&zMoatRendered=1&zMoatSlotTargetingLoaded=1&zMoatSlotTargetingSet=1&zMoatPageDataTargetingSet=1&zMoatSafetyTargetingSet=1&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1502698028&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
412ms
106ms
|
XHR
application/json |
52.216.169.93
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
homadclienthttpsle-json.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
286 B
677 B
|
87ms
16ms
|
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
|
26ms
24ms
|
XHR
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_mug0-818539-i_rc.jpg
www.golem.de/1997/adproxy/
|
68 B
486 B
|
61ms
60ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/
Frame 5A92
|
73 KB
27 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81f::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:81f::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 939afa865a77f028eab9017820c823d2b8c103c67ac3634d52d98d7a07f8a12a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 5A92
|
0
137 B
|
22ms
21ms
|
Image
image/gif |
172.217.22.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuib8dG_og8wdEoFDIxYlLT7KCWZGkOWqX_FVfyKhW5k2NBaHfcVcYPjNyFu408YW54IEazyhCiWMx9mCwRfd7Z86k5JWZzgWP9gQRxrfPM0QHaAzYf0nwGtVfQ_AwEd9mTLUOhiT2znPVOYCoKcQkyjRAgQ2yYHs2fXSpAmjNMw3gJJgbsF72TspOp2XKKWb-WHEgfnrR8yfMd5md7nWsIWlWfnFfdNFZ_8yhFVlvTHeDvvHUBsA&sai=AMfl-YSz5eR3g74s8COL-OZKwX4MwaeAQ2Q9jUTTnDVnYmETZKVgscRcrxO-EVwdF3_lKwuFyEaDgV4ZritzYZX4H9dIIa8ndRRIQxiYqToz&sig=Cg0ArKJSzCly16ilmvvxEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.22.98
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s18-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
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame 545D
|
256 KB
79 KB
|
23ms
20ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
20ms
19ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile3&zMoatRendered=2&zMoatSlotTargetingLoaded=2&zMoatSlotTargetingSet=2&zMoatPageDataTargetingSet=2&zMoatSafetyTargetingSet=2&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1219476211&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
150ms
27ms
|
Script
application/javascript |
54.72.140.158
Amazon.com
|
|
|
GET
H/1.1
|
204
No Content
|
m
p.yieldlab.net/
|
0
336 B
|
77ms
13ms
|
Image
text/plain |
85.114.144.195
MYLOC-AS
|
|
General
- Full URL
- https://p.yieldlab.net/m?dm_id=21719&ext_id=BSasWsa8ESJsEiU-BDf-BiUABifkBSU0WDfABifABifABfrr&ddata_seg=e0
- 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
-
85.114.144.195
, Germany,
ASN24961
(MYLOC-AS, DE),
- Reverse DNS
- lb.yieldlab.net
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
DENY |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
2.gif
xpl.theadex.com/d/327/i/
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasWsa8ESJsEiU-BDf-BiUABifkBSU0WDfABifABifABfrr
-
https://xpl.theadex.com/d/327/i/2.gif?_sc=1000918391910380040&axd_pid=22&axd_fuid=BSasWsa8ESJsEiU-BDf-BiUABifkBSU0WDfABifABifABfrr
|
43 B
717 B
|
18ms
13ms
|
Image
image/gif |
89.163.159.101
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
a.js
d.df-srv.de/match/
Redirect Chain
-
https://d.df-srv.de/match/a.js?pid=42
-
https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fd.df-srv.de%2Fmatch%2Fa.js%3Fpid%3D42%26l%3D1%26adition_vid%3D%25%25COOKIE%25%25
-
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6603726265934215195
|
3 B
466 B
|
50ms
10ms
|
Image
application/javascript |
2001:16e0:10a:1::c1:1
RKOM R-KOM Regens...
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
221 B
888 B
|
57ms
8ms
|
XHR
application/json |
143.204.101.118
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
/
iqdigital.demdex.net/event/
|
0
739 B
|
39ms
38ms
|
Image
application/json |
54.194.25.183
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
3ms
1ms
|
XHR
text/javascript |
88.99.5.37
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame 5A92
|
256 KB
79 KB
|
10ms
9ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 51A2
|
0
0
|
221ms
220ms
|
Document
text/html |
2a00:1450:4001:812::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=3446949021&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837969&bpp=16&bdt=873&fdt=19&idt=293&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&correlator=5921099423551&frm=20&pv=2&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=4031&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=636311223&ifi=4&fsb=1&xpc=ntjkkyk7hH&p=https%3A//www.golem.de&dtd=322
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::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
S
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
Frame CBE0
|
73 KB
0
|
22ms
22ms
|
Script
text/javascript |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 6f1820fb18fd530846406f6f01440f4124b5ebb231a5bdb9f6b60ddf5737c42a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/
Frame CBE0
|
73 KB
0
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81f::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:81f::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 939afa865a77f028eab9017820c823d2b8c103c67ac3634d52d98d7a07f8a12a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame CBE0
|
256 KB
79 KB
|
7ms
6ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame CBE0
|
214 B
0
|
|
Image
image/png |
|
|
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame CBE0
|
0
137 B
|
19ms
17ms
|
Image
image/gif |
172.217.22.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvqsWT8hexYj6HJ7x0hGWfhqMkvg3T4IxqvricQkYokPlSO8V5DBwIRw4hdpazIy8hcnNW_mzz6iuE0qky3b3Y3dpwYzL9jyYkIbt_cnM48fFRp8EjnKaXwrYmL7Rsij9ruvkvom_GFk79W92a5ACPWzQkgpmW-OpcrycRvO82iczGbEo35m4whiu_AEOVuOqi9c5H1trXttQB2BoPOltz4gtpAQtdwss7w2eGXeCa7h4oIY3CNLLVMzBw&sai=AMfl-YSr-XtEhddFgYEFE98TVARRJW1lsK0YYCs9sl1fKggBNIh6HAQ0fmATA6uaC5vLK-JPVhIPal_SjEN1JUi5hGpN2vFrHJGmSdDpcNJ-&sig=Cg0ArKJSzCKq67zjPDeXEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.22.98
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s18-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
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
10ms
9ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile16&zMoatRendered=3&zMoatSlotTargetingLoaded=3&zMoatSlotTargetingSet=2&zMoatPageDataTargetingSet=3&zMoatSafetyTargetingSet=3&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1580907549&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
|
187 KB
51 KB
|
10ms
10ms
|
XHR
application/javascript |
143.204.101.118
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
display-ohne-werbung3.png
www.golem.de/staticrl/images/abo/
|
924 B
1 KB
|
21ms
20ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
General
- Full URL
- https://www.golem.de/staticrl/images/abo/display-ohne-werbung3.png
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.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
- fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548
|
GET
H/1.1
|
200
OK
|
display-mit-werbung3.png
www.golem.de/staticrl/images/abo/
|
1 KB
1 KB
|
21ms
20ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
General
- Full URL
- https://www.golem.de/staticrl/images/abo/display-mit-werbung3.png
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.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
- e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
Frame CBE0
|
109 B
171 B
|
17ms
16ms
|
Script
application/javascript |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- 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
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
Frame CBE0
|
109 B
171 B
|
17ms
16ms
|
Script
application/javascript |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- 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
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
ca-pub-6583763995580712.js
Show response
pagead2.googlesyndication.com/pub-config/r20160913/
Frame CBE0
|
68 B
179 B
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-6583763995580712.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/
Frame DE15
|
196 KB
0
|
26ms
25ms
|
Script
text/javascript |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 6e02736a6f9e93cdfe22ded97de7a301f4633fad2372bfaa40c825ed2500c4a5
- 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 0AA9
|
0
0
|
311ms
310ms
|
Document
text/html |
2a00:1450:4001:812::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=2459742235&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837989&bpp=7&bdt=892&fdt=403&idt=404&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120&correlator=5921099423551&frm=20&pv=1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=4708&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=1823298079&ifi=5&fsb=1&xpc=kgP9ZSolLA&p=https%3A//www.golem.de&dtd=410
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::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
|
activation
adstax-match.adrtx.net/
Frame 4A08
|
0
0
|
113ms
28ms
|
Document
text/html |
52.208.127.173
Amazon.com
|
|
|
GET
S
|
200
|
vgs.json
Show response
cdn.radiantmediatechs.com/rmp/rr/
|
4 KB
2 KB
|
45ms
11ms
|
XHR
application/json |
2400:cb00:2048:1::6818:6624
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
|
19ms
19ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/
Frame E0C0
|
196 KB
0
|
26ms
25ms
|
Script
text/javascript |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 6e02736a6f9e93cdfe22ded97de7a301f4633fad2372bfaa40c825ed2500c4a5
- 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 85E9
|
0
0
|
159ms
158ms
|
Document
text/html |
2a00:1450:4001:812::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=653379571&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837996&bpp=5&bdt=901&fdt=503&idt=506&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=5921099423551&frm=20&pv=1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=5417&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=154924829&ifi=6&fsb=1&xpc=RFgQgHM55z&p=https%3A//www.golem.de&dtd=515
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::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
DATA
|
200
OK
|
truncated
Show response
/
|
187 KB
0
|
|
Script
text/javascript |
|
|
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/
Frame 8013
|
196 KB
0
|
26ms
25ms
|
Script
text/javascript |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 6e02736a6f9e93cdfe22ded97de7a301f4633fad2372bfaa40c825ed2500c4a5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
/
golem.whitepaperdb.de/
Frame E7A8
|
0
0
|
75ms
19ms
|
Document
text/html |
62.138.242.228
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://golem.whitepaperdb.de/?tag=golem
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.138.242.228
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- mail.whitepaperdb.de
- Software
-
nginx /
PHP/7.0.32
PleskLin
- Resource Hash
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/
Frame DB18
|
73 KB
0
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81f::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:81f::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 939afa865a77f028eab9017820c823d2b8c103c67ac3634d52d98d7a07f8a12a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame DB18
|
256 KB
79 KB
|
7ms
7ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame DB18
|
216 B
0
|
|
Image
image/png |
|
|
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame DB18
|
0
56 B
|
27ms
18ms
|
Image
image/gif |
172.217.22.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssQsbwVJPlehNMVjtkqbhbxD4pUAddam_ib7oF-HX7oZ7W4NMYqII4wyh9ujfQzafTprK8W9_JMQw2nZf4j20caooIjyHUMaMO8_OyjejhEw0CLo-PJSzHLSOuKuf_RzdNvAO5ah5Ncio3JfpZtHdNLZ6fZjQEP6ysunOtZnXsW7jQpYdon4UY0eF3lRGlrLPpGvF-_oH5ZbjEHZD-KrCCXYqvKGnJsZln1LIMxJN2_69h5L1r5g3NFxVs8YeHZw6vPOHSEQZXLLw&sai=AMfl-YQVgda6IAQpXwdbIlToC8UY1tOptiRMWmb-7RCO9FUmenRztfz0rl2RucDDRwFz-69N_MJQCU1HVzZKHlXbSDbGay4UQL7vWyGBeIJnw74XspRa2mYz1c01Upse&sig=Cg0ArKJSzLcBwyL_5jz0EAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.22.98
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s18-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
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
11ms
6ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile8&zMoatRendered=4&zMoatSlotTargetingLoaded=4&zMoatSlotTargetingSet=3&zMoatPageDataTargetingSet=4&zMoatSafetyTargetingSet=4&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=98057773&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
|
230 KB
79 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:81f::200a
Google LLC
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
68 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
publishertag.prebid.js
Show response
static.criteo.net/js/ld/
|
34 KB
12 KB
|
84ms
20ms
|
Script
text/javascript |
178.250.0.130
ASN-CRITEO-EUROPE
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
715 B
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
2 KB
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
|
19ms
18ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
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
|
18ms
18ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/
Frame 115E
|
196 KB
0
|
26ms
25ms
|
Script
text/javascript |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 6e02736a6f9e93cdfe22ded97de7a301f4633fad2372bfaa40c825ed2500c4a5
- 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 818F
|
0
0
|
314ms
313ms
|
Document
text/html |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=2573259754&adf=608545715&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1537549838359&bpp=5&bdt=435&fdt=471&idt=473&shv=r20180917&cbv=r20180604&saldr=aa&correlator=5921099423551&frm=23&ife=4&pv=2&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1921501932&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&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=393&ady=10772&biw=1585&bih=1200&isw=800&ish=250&ifk=3088420174&scr_x=0&scr_y=0&eid=20195144%2C21060853%2C62710015%2C62710017&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=481
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::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
S
|
200
|
osd.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/
Frame CBE0
|
72 KB
26 KB
|
7ms
7ms
|
Script
text/javascript |
2a00:1450:4001:812::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/osd.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:812::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- f4055bd0cdf467ff6940a20d9284a60987a85578033114820b1dc605dbb70991
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/
Frame 876E
|
73 KB
0
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81f::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:81f::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 939afa865a77f028eab9017820c823d2b8c103c67ac3634d52d98d7a07f8a12a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame 876E
|
256 KB
79 KB
|
8ms
7ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 876E
|
216 B
0
|
|
Image
image/png |
|
|
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 876E
|
0
56 B
|
19ms
19ms
|
Image
image/gif |
172.217.22.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsugxTl-mSKZqyGv9YQRvcDVobZVKb3qnNpn89CKSrSU2aIcMV0xH4k4ps03KoSmvRUkJqtO5Y-tVzwz7WZUrUd-0bBpqu-tMdr0IoQ6Pg59UTsyz9ZjYe7H9ndp1P1JD5JHx-TiFbh08AIqT1dHW_vZdTg3ipePYn2KYkuJXziS-_IGV2OzyygH90LmeSfv9E4k0VGB5xkzjGZU_CrtvOhmoTvwo85OuofU05FZ1DLHYhT5E5NuBw&sai=AMfl-YRZ3-l5HWNy8yfV1EVqTOOktknMySBBi2FIqcFnEz0MOcgcb_XDOFlPgVW39NMaO6QdM75r5jB8gVXWZiNr2z0KwSH8ivBv8zs1gENNI4SkX6OMRnyK5lVdXFM&sig=Cg0ArKJSzPKrd3i1sscDEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.22.98
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s18-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
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
6ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile4&zMoatRendered=5&zMoatSlotTargetingLoaded=5&zMoatSlotTargetingSet=4&zMoatPageDataTargetingSet=5&zMoatSafetyTargetingSet=5&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1477985836&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
418ms
111ms
|
XHR
application/json |
52.216.169.93
Amazon.com
|
|
General
- Full URL
- https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=9745547850
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.216.169.93
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/
|
286 B
677 B
|
15ms
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=5326341591
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
- 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
- ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
221 B
888 B
|
24ms
9ms
|
XHR
application/json |
143.204.101.112
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=6835271914
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.101.112
Wilmington, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-101-112.fra50.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 4ca761566d6efd4d84cc704d3c6e61132e2163d17707ec72415c82ab22d2fe87
|
GET
H2
|
200
|
bridge3.236.0_de.html
imasdk.googleapis.com/js/core/
Frame BA72
|
0
0
|
9ms
8ms
|
Document
text/html |
2a00:1450:4001:81f::200a
Google LLC
|
|
General
- Full URL
- https://imasdk.googleapis.com/js/core/bridge3.236.0_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:81f::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
S
|
200
|
client.js
Show response
s0.2mdn.net/instream/video/
|
26 KB
10 KB
|
42ms
40ms
|
Script
text/javascript |
216.58.205.230
Google LLC
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.golem.de/d5a86b046d006a032b7d94f27c7b10c6bc1cbfea/
|
221 B
1 KB
|
83ms
36ms
|
XHR
application/json |
148.251.0.183
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/d5a86b046d006a032b7d94f27c7b10c6bc1cbfea/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
- 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
-
AmazonS3 /
- Resource Hash
- 4ca761566d6efd4d84cc704d3c6e61132e2163d17707ec72415c82ab22d2fe87
|
GET
S
|
200
|
rum.js
Show response
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/
Frame DB18
|
42 KB
16 KB
|
7ms
7ms
|
Script
text/javascript |
2a00:1450:4001:81f::2001
Google LLC
|
|
|
POST
S
|
204
|
csi
csi.gstatic.com/
Frame DB18
|
0
56 B
|
107ms
107ms
|
Other
image/gif |
2607:f8b0:400d:c01::5e
Google LLC
|
|
General
- Full URL
- https://csi.gstatic.com/csi?v=2&s=pagead&action=csi_pagead&dmc=8&puid=1~jmc9h4r8&chm=1&ctx=2&gqid=DialW4irBYnKtwe795-gDA&qqid=CLmnsr_LzN0CFYPV7Qodz2EFfw&met.4=fb.gm~lb.gv~ol.t5~idt.j4~dt.6&met.3=197.gs~123.gr_3~121.gv~118.h3~118.kx_8~115.mh~118.mi~118.mp~118.oy~118.p2~115.q2~118.r4~117.t5~115.u0~118.u7~118.u8~113.v8_4~112.v6_6&met.1=1.jmc9h3w2~14.1q~15.1s~16.1s~17.1s~18.1s~19.1t~20.1t~21.1t~22.ik~23.ik&met.7=CBsQBSDXBDhQ~CAcQChgBINsEKNsEMNsEaNsEcNsEgAG60wGIAbLGBLABAbgBAQ~CBsQCiDfBDgd~CCIQBhgBIOUEKOUEMIIFOB1o7ARwgQV4OLABAbgBAw~CBgQChgBILkIKLkIMMEIOAhouQhwwAh4m32AAcl8iAGzzQKwAQG4AQM&met.2=15.5~16.cer
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/rum.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2607:f8b0:400d:c01::5e
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.golem.de/
|
24 B
281 B
|
18ms
1ms
|
Script
application/octet-stream |
136.243.65.40
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/hic_qos?adv_partner&_werbebanner_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.65.40
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.40.65.243.136.clients.your-server.de
- Software
-
openresty/1.13.6.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.golem.de/2f8e340548a291b20adebaafb56bf5bbaa50347d/
|
110 B
672 B
|
4ms
4ms
|
XHR
application/json |
136.243.65.40
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/2f8e340548a291b20adebaafb56bf5bbaa50347d/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.65.40
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.40.65.243.136.clients.your-server.de
- Software
-
TornadoServer/4.5.3 /
- Resource Hash
- 9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
|