URL: http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2...
Submission: On September 06 via manual from DK

Summary

This website contacted 4 IPs in 3 countries across 3 domains to perform 11 HTTP transactions. The main IP is 2606:4700:3030::681b:8877, located in United States and belongs to CLOUDFLARENET, US. The main domain is campusmoodle.rgu.cfek.me.
This is the only time campusmoodle.rgu.cfek.me was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
1 2606:4700:303... 13335 (CLOUDFLAR...)
7 194.66.87.68 786 (JANET Jis...)
2 2a00:1450:400... 15169 (GOOGLE)
11 4
Domain Requested by
7 campusmoodle.rgu.ac.uk application
campusmoodle.rgu.ac.uk
2 www.google-analytics.com campusmoodle.rgu.cfek.me
1 campusmoodle.rgu.cfek.me
11 3

This site contains links to these domains. Also see Links.

Domain
campusmoodle.rgu.ac.uk
www.rgu.ac.uk
www.facebook.com
twitter.com
www.linkedin.com
www.flickr.com
Subject Issuer Validity Valid
*.google-analytics.com
GTS CA 1O1
2020-08-19 -
2020-11-11
3 months crt.sh

This page contains 1 frames:

Primary Page: http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
Frame ID: 9D612B2B130FD58E9C8B500CFEB913DF
Requests: 22 HTTP requests in this frame

Screenshot


Detected technologies

Overall confidence: 100%
Detected patterns
  • headers server /^cloudflare$/i

Page Statistics

11
Requests

18 %
HTTPS

67 %
IPv6

3
Domains

3
Subdomains

4
IPs

3
Countries

1818 kB
Transfer

6894 kB
Size

6
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 13
  • http://www.google-analytics.com/ga.js HTTP 307
  • https://www.google-analytics.com/ga.js
Request Chain 14
  • http://www.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1818937528&utmhn=campusmoodle.rgu.cfek.me&utmcs=UTF-8&utmsr=1600x1200&utmvp=1600x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=campusmoodle.rgu.ac.uk%3A%20Log%20in%20to%20the%20site&utmhid=1097526309&utmr=-&utmp=%2Fclient_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res%2F&utmht=1599384699648&utmac=MO-24562687-1&utmcc=__utma%3D178127543.971319287.1599384700.1599384700.1599384700.1%3B%2B__utmz%3D178127543.1599384700.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&utmjid=1904597771&utmredir=1&utmu=qAAAAAAAAAAAAAAAAAAAAAAE~ HTTP 307
  • https://www.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1818937528&utmhn=campusmoodle.rgu.cfek.me&utmcs=UTF-8&utmsr=1600x1200&utmvp=1600x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=campusmoodle.rgu.ac.uk%3A%20Log%20in%20to%20the%20site&utmhid=1097526309&utmr=-&utmp=%2Fclient_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res%2F&utmht=1599384699648&utmac=MO-24562687-1&utmcc=__utma%3D178127543.971319287.1599384700.1599384700.1599384700.1%3B%2B__utmz%3D178127543.1599384700.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&utmjid=1904597771&utmredir=1&utmu=qAAAAAAAAAAAAAAAAAAAAAAE~

11 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
3 MB
1 MB
Document
General
Full URL
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
Protocol
HTTP/1.1
Server
2606:4700:3030::681b:8877 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
935bb722b56bd9f92d9df495f6fdf0804b9bb3c4bf3c95df42d54c5b144d3679

Request headers

Host
campusmoodle.rgu.cfek.me
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding
gzip, deflate
Accept-Language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sun, 06 Sep 2020 09:31:38 GMT
Content-Type
text/html
Transfer-Encoding
chunked
Connection
keep-alive
Set-Cookie
__cfduid=d7158f7e4ea61944f0886999f6993fc9f1599384698; expires=Tue, 06-Oct-20 09:31:38 GMT; path=/; domain=.cfek.me; HttpOnly; SameSite=Lax
Last-Modified
Wed, 17 Jun 2020 18:48:48 GMT
Vary
Accept-Encoding
CF-Cache-Status
DYNAMIC
cf-request-id
05045ad7030000c2b3e4902200000001
Server
cloudflare
CF-RAY
5ce72d9e6a3bc2b3-FRA
Content-Encoding
gzip
truncated
/
45 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
text/javascript
truncated
/
2 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
cac10be6dad14d35e38b41c9c1238ced63676b3165529ae4f8aaa2b88577ed67

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
22 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
ed623c5b0e8b71a1c6966862502d4879ebc3aa2b521eaba96bbfcc35e6f13f3b

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
15 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
26d1a45d173703f01ca9bb8be4335bae6005c3bc0a5f78b380ad18fb152b8835

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
877 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
52f0200f85667a8a4c8ba83e9b8f7ae71d958be50ef56756ee986ff4e4d365b1

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
85 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4d8b560b0de451450b378976aadf95623e77714bfdcddf7a4602332d2c98d394

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
276 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
13eaaadfa414f262b7964320054bb2b322b9ef9f3522bc25c9d60dc83b5141cf

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
21 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
449723b1d16bcd4fd32e34bcbd8f41a2ff7cfe84b939740a9417f71dd4f61479

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
75 KB
75 KB
Font
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe

Request headers

Origin
http://campusmoodle.rgu.cfek.me
Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/font-woff2
truncated
/
21 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d7aadc43ad72981f6957aa239449de15dc56bd4f108fc6d983c55fd7458a4c0d

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
image/svg+xml
truncated
/
16 KB
16 KB
Font
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
573cadd88f7a560645cd32c0853af94abd70afd37790ca72c01134b214863508

Request headers

Origin
http://campusmoodle.rgu.cfek.me
Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/font-woff
truncated
/
17 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4b9f572393f50aa7fd63ba6ac5d3b39c1a4ee71e27766757a76821418c040650

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
yui_combo.php
campusmoodle.rgu.ac.uk/theme/
2 KB
1 KB
Script
General
Full URL
http://campusmoodle.rgu.ac.uk/theme/yui_combo.php?m/1591866501/core/event/event-min.js&m/1591866501/filter_mathjaxloader/loader/loader-min.js
Requested by
Host: application
URL: data:application/javascript;base64,LyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCnR5cGVvZiBZVUkhPSJ1bmRlZmluZWQiJiYoWVVJLl9ZVUk9WVVJKTt2YXIgWVVJPWZ1bmN0aW9uKCl7dmFyIGU9MCx0PXRoaXMsbj1hcmd1bWVudHMscj1uLmxlbmd0aCxpPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmUuaGFzT3duUHJvcGVydHkmJmUgaW5zdGFuY2VvZiB0fSxzPXR5cGVvZiBZVUlfY29uZmlnIT0idW5kZWZpbmVkIiYmWVVJX2NvbmZpZztpKHQsWVVJKT8odC5faW5pdCgpLFlVSS5HbG9iYWxDb25maWcmJnQuYXBwbHlDb25maWcoWVVJLkdsb2JhbENvbmZpZykscyYmdC5hcHBseUNvbmZpZyhzKSxyfHx0Ll9zZXR1cCgpKTp0PW5ldyBZVUk7aWYocil7Zm9yKDtlPHI7ZSsrKXQuYXBwbHlDb25maWcobltlXSk7dC5fc2V0dXAoKX1yZXR1cm4gdC5pbnN0YW5jZU9mPWksdH07KGZ1bmN0aW9uKCl7dmFyIGUsdCxuPSIzLjE3LjIiLHI9Ii4iLGk9Imh0dHA6Ly95dWkueWFob29hcGlzLmNvbS8iLHM9Inl1aTMtanMtZW5hYmxlZCIsbz0ieXVpMy1jc3Mtc3RhbXAiLHU9ZnVuY3Rpb24oKXt9LGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLGY9eyJpby54ZHJSZWFkeSI6MSwiaW8ueGRyUmVzcG9uc2UiOjEsIlNXRi5ldmVudEhhbmRsZXIiOjF9LGw9dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCIsYz1sP3dpbmRvdzpudWxsLGg9bD9jLmRvY3VtZW50Om51bGwscD1oJiZoLmRvY3VtZW50RWxlbWVudCxkPXAmJnAuY2xhc3NOYW1lLHY9e30sbT0obmV3IERhdGUpLmdldFRpbWUoKSxnPWZ1bmN0aW9uKGUsdCxuLHIpe2UmJmUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLHIpOmUmJmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9uIit0LG4pfSx5PWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcil0cnl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbixyKX1jYXRjaChpKXt9ZWxzZSBlJiZlLmRldGFjaEV2ZW50JiZlLmRldGFjaEV2ZW50KCJvbiIrdCxuKX0sYj1mdW5jdGlvbigpe1lVSS5FbnYuRE9NUmVhZHk9ITAsbCYmeShoLCJET01Db250ZW50TG9hZGVkIixiKX0sdz1mdW5jdGlvbigpe1lVSS5FbnYud2luZG93TG9hZGVkPSEwLFlVSS5FbnYuRE9NUmVhZHk9ITAsbCYmeSh3aW5kb3csImxvYWQiLHcpfSxFPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5FbnYuX2xvYWRlcixyPVsibG9hZGVyLWJhc2UiXSxpPVlVSS5FbnYscz1pLm1vZHM7cmV0dXJuIG4/KG4uaWdub3JlUmVnaXN0ZXJlZD0hMSxuLm9uRW5kPW51bGwsbi5kYXRhPW51bGwsbi5yZXF1aXJlZD1bXSxuLmxvYWRUeXBlPW51bGwpOihuPW5ldyBlLkxvYWRlcihlLmNvbmZpZyksZS5FbnYuX2xvYWRlcj1uKSxzJiZzLmxvYWRlciYmKHI9W10uY29uY2F0KHIsWVVJLkVudi5sb2FkZXJFeHRyYXMpKSxZVUkuRW52LmNvcmU9ZS5BcnJheS5kZWR1cGUoW10uY29uY2F0KFlVSS5FbnYuY29yZSxyKSksbn0sUz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSx4PXtzdWNjZXNzOiEwfTtwJiZkLmluZGV4T2Yocyk9PS0xJiYoZCYmKGQrPSIgIiksZCs9cyxwLmNsYXNzTmFtZT1kKSxuLmluZGV4T2YoIkAiKT4tMSYmKG49IjMuNS4wIiksZT17YXBwbHlDb25maWc6ZnVuY3Rpb24oZSl7ZT1lfHx1O3ZhciB0LG4scj10aGlzLmNvbmZpZyxpPXIubW9kdWxlcyxzPXIuZ3JvdXBzLG89ci5hbGlhc2VzLGE9dGhpcy5FbnYuX2xvYWRlcjtmb3IobiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0PWVbbl0saSYmbj09Im1vZHVsZXMiP1MoaSx0KTpvJiZuPT0iYWxpYXNlcyI/UyhvLHQpOnMmJm49PSJncm91cHMiP1Mocyx0KTpuPT0id2luIj8ocltuXT10JiZ0LmNvbnRlbnRXaW5kb3d8fHQsci5kb2M9cltuXT9yW25dLmRvY3VtZW50Om51bGwpOm4hPSJfeXVpZCImJihyW25dPXQpKTthJiZhLl9jb25maWcoZSl9LF9jb25maWc6ZnVuY3Rpb24oZSl7dGhpcy5hcHBseUNvbmZpZyhlKX0sX2luaXQ6ZnVuY3Rpb24oKXt2YXIgZSx0LHI9dGhpcyxzPVlVSS5FbnYsdT1yLkVudixhO3IudmVyc2lvbj1uO2lmKCF1KXtyLkVudj17Y29yZTpbImdldCIsImZlYXR1cmVzIiwiaW50bC1iYXNlIiwieXVpLWxvZyIsInl1aS1sYXRlciIsImxvYWRlci1iYXNlIiwibG9hZGVyLXJvbGx1cCIsImxvYWRlci15dWkzIl0sbG9hZGVyRXh0cmFzOlsibG9hZGVyLXJvbGx1cCIsImxvYWRlci15dWkzIl0sbW9kczp7fSx2ZXJzaW9uczp7fSxiYXNlOmksY2RuOmkrbisiL2J1aWxkLyIsX2lkeDowLF91c2VkOnt9LF9hdHRhY2hlZDp7fSxfZXhwb3J0ZWQ6e30sX21pc3NlZDpbXSxfeWlkeDowLF91aWR4OjAsX2d1aWRwOiJ5IixfbG9hZGVkOnt9LF9CQVNFX1JFOi8oPzpcPyg/OlteJl0qJikqKFteJl0qKSk/XGIoeXVpKD86LVx3Kyk/KVwvXDIoPzotKG1pbnxkZWJ1ZykpP1wuanMvLHBhcnNlQmFzZVBhdGg6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1hdGNoKHQpLHIsaTtyZXR1cm4gbiYmKHI9UmVnRXhwLmxlZnRDb250ZXh0fHxlLnNsaWNlKDAsZS5pbmRleE9mKG5bMF0pKSxpPW5bM10sblsxXSYmKHIrPSI/IituWzFdKSxyPXtmaWx0ZXI6aSxwYXRoOnJ9KSxyfSxnZXRCYXNlOnMmJnMuZ2V0QmFzZXx8ZnVuY3Rpb24odCl7dmFyIG49aCYmaC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iil8fFtdLGk9dS5jZG4scyxvLGEsZjtmb3Iobz0wLGE9bi5sZW5ndGg7bzxhOysrbyl7Zj1uW29dLnNyYztpZihmKXtzPXIuRW52LnBhcnNlQmFzZVBhdGgoZix0KTtpZihzKXtlPXMuZmlsdGVyLGk9cy5wYXRoO2JyZWFrfX19cmV0dXJuIGl9fSx1PXIuRW52LHUuX2xvYWRlZFtuXT17fTtpZihzJiZyIT09WVVJKXUuX3lpZHg9KytzLl95aWR4LHUuX2d1aWRwPSgieXVpXyIrbisiXyIrdS5feWlkeCsiXyIrbSkucmVwbGFjZSgvW15hLXowLTlfXSsvZywiXyIpO2Vsc2UgaWYoWVVJLl9ZVUkpe3M9WVVJLl9ZVUkuRW52LHUuX3lpZHgrPXMuX3lpZHgsdS5fdWlkeCs9cy5fdWlkeDtmb3IoYSBpbiBzKWEgaW4gdXx8KHVbYV09c1thXSk7ZGVsZXRlIFlVSS5fWVVJfXIuaWQ9ci5zdGFtcChyKSx2W3IuaWRdPXJ9ci5jb25zdHJ1Y3Rvcj1ZVUksci5jb25maWc9ci5jb25maWd8fHtib290c3RyYXA6ITAsY2FjaGVVc2U6ITAsZGVidWc6ITAsZG9jOmgsZmV0Y2hDU1M6ITAsdGhyb3dGYWlsOiEwLHVzZUJyb3dzZXJDb25zb2xlOiEwLHVzZU5hdGl2ZUVTNTohMCx3aW46YyxnbG9iYWw6RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0saCYmIWguZ2V0RWxlbWVudEJ5SWQobyk/KHQ9aC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LmlubmVySFRNTD0nPGRpdiBpZD0iJytvKyciIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQiPjwvZGl2PicsWVVJLkVudi5jc3NTdGFtcEVsPXQuZmlyc3RDaGlsZCxoLmJvZHk/aC5ib2R5LmFwcGVuZENoaWxkKFlVSS5FbnYuY3NzU3RhbXBFbCk6cC5pbnNlcnRCZWZvcmUoWVVJLkVudi5jc3NTdGFtcEVsLHAuZmlyc3RDaGlsZCkpOmgmJmguZ2V0RWxlbWVudEJ5SWQobykmJiFZVUkuRW52LmNzc1N0YW1wRWwmJihZVUkuRW52LmNzc1N0YW1wRWw9aC5nZXRFbGVtZW50QnlJZChvKSksci5jb25maWcubGFuZz1yLmNvbmZpZy5sYW5nfHwiZW4tVVMiLHIuY29uZmlnLmJhc2U9WVVJLmNvbmZpZy5iYXNlfHxyLkVudi5nZXRCYXNlKHIuRW52Ll9CQVNFX1JFKTtpZighZXx8ISJtaW5kZWJ1ZyIuaW5kZXhPZihlKSllPSJtaW4iO2U9ZT8iLSIrZTplLHIuY29uZmlnLmxvYWRlclBhdGg9WVVJLmNvbmZpZy5sb2FkZXJQYXRofHwibG9hZGVyL2xvYWRlciIrZSsiLmpzIn0sX3NldHVwOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLG49W10scj1ZVUkuRW52Lm1vZHMsaT10LmNvbmZpZy5jb3JlfHxbXS5jb25jYXQoWVVJLkVudi5jb3JlKTtmb3IoZT0wO2U8aS5sZW5ndGg7ZSsrKXJbaVtlXV0mJm4ucHVzaChpW2VdKTt0Ll9hdHRhY2goWyJ5dWktYmFzZSJdKSx0Ll9hdHRhY2gobiksdC5Mb2FkZXImJkUodCl9LGFwcGx5VG86ZnVuY3Rpb24oZSx0LG4pe2lmKHQgaW4gZil7dmFyIHI9dltlXSxpLHMsbztpZihyKXtpPXQuc3BsaXQoIi4iKSxzPXI7Zm9yKG89MDtvPGkubGVuZ3RoO28rPTEpcz1zW2lbb11dLHN8fHRoaXMubG9nKCJhcHBseVRvIG5vdCBmb3VuZDogIit0LCJ3YXJuIiwieXVpIik7cmV0dXJuIHMmJnMuYXBwbHkocixuKX1yZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5sb2codCsiOiBhcHBseVRvIG5vdCBhbGxvd2VkIiwid2FybiIsInl1aSIpLG51bGx9LGFkZDpmdW5jdGlvbihlLHQsbixyKXtyPXJ8fHt9O3ZhciBpPVlVSS5FbnYscz17bmFtZTplLGZuOnQsdmVyc2lvbjpuLGRldGFpbHM6cn0sbz17fSx1LGEsZixsLGM9aS52ZXJzaW9ucztpLm1vZHNbZV09cyxjW25dPWNbbl18fHt9LGNbbl1bZV09cztmb3IobCBpbiB2KXYuaGFzT3duUHJvcGVydHkobCkmJihhPXZbbF0sb1thLmlkXXx8KG9bYS5pZF09ITAsdT1hLkVudi5fbG9hZGVyLHUmJihmPXUuZ2V0TW9kdWxlSW5mbyhlKSwoIWZ8fGYudGVtcCkmJnUuYWRkTW9kdWxlKHIsZSkpKSk7cmV0dXJuIHRoaXN9LF9hdHRhY2g6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvLHUsYSxmPVlVSS5FbnYubW9kcyxsPVlVSS5FbnYuYWxpYXNlcyxjPXRoaXMsaCxwPVlVSS5FbnYuX3JlbmRlcmVkTW9kcyxkPWMuRW52Ll9sb2FkZXIsdj1jLkVudi5fYXR0YWNoZWQsbT1jLkVudi5fZXhwb3J0ZWQsZz1lLmxlbmd0aCxkLHksYix3PVtdLEUsUyx4LFQsTixDLGs7Zm9yKG49MDtuPGc7bisrKXtyPWVbbl0saT1mW3JdLHcucHVzaChyKTtpZihkJiZkLmNvbmRpdGlvbnNbcl0pZm9yKGggaW4gZC5jb25kaXRpb25zW3JdKWQuY29uZGl0aW9uc1tyXS5oYXNPd25Qcm9wZXJ0eShoKSYmKHk9ZC5jb25kaXRpb25zW3JdW2hdLGI9eSYmKHkudWEmJmMuVUFbeS51YV18fHkudGVzdCYmeS50ZXN0KGMpKSxiJiZ3LnB1c2goeS5uYW1lKSl9ZT13LGc9ZS5sZW5ndGg7Zm9yKG49MDtuPGc7bisrKWlmKCF2W2Vbbl1dKXtyPWVbbl0saT1mW3JdO2lmKGwmJmxbcl0mJiFpKXtjLl9hdHRhY2gobFtyXSk7Y29udGludWV9aWYoIWkpVD1kJiZkLmdldE1vZHVsZUluZm8ociksVCYmKGk9VCx0PSEwKSwhdCYmciYmci5pbmRleE9mKCJza2luLSIpPT09LTEmJnIuaW5kZXhPZigiY3NzIik9PT0tMSYmKGMuRW52Ll9taXNzZWQucHVzaChyKSxjLkVudi5fbWlzc2VkPWMuQXJyYXkuZGVkdXBlKGMuRW52Ll9taXNzZWQpLGMubWVzc2FnZSgiTk9UIGxvYWRlZDogIityLCJ3YXJuIiwieXVpIikpO2Vsc2V7dltyXT0hMDtmb3IoaD0wO2g8Yy5FbnYuX21pc3NlZC5sZW5ndGg7aCsrKWMuRW52Ll9taXNzZWRbaF09PT1yJiYoYy5tZXNzYWdlKCJGb3VuZDogIityKyIgKHdhcyByZXBvcnRlZCBhcyBtaXNzaW5nIGVhcmxpZXIpIiwid2FybiIsInl1aSIpLGMuRW52Ll9taXNzZWQuc3BsaWNlKGgsMSkpO2lmKGQmJiFkLl9jYW5CZUF0dGFjaGVkKHIpKXJldHVybiEwO2lmKGQmJnAmJnBbcl0mJnBbcl0udGVtcCl7ZC5nZXRSZXF1aXJlcyhwW3JdKSxvPVtdLFQ9ZC5nZXRNb2R1bGVJbmZvKHIpO2ZvcihoIGluIFQuZXhwYW5kZWRfbWFwKVQuZXhwYW5kZWRfbWFwLmhhc093blByb3BlcnR5KGgpJiZvLnB1c2goaCk7Yy5fYXR0YWNoKG8pfXM9aS5kZXRhaWxzLG89cy5yZXF1aXJlcyxTPXMuZXMsdT1zLnVzZSxhPXMuYWZ0ZXIscy5sYW5nJiYobz1vfHxbXSxvLnVuc2hpZnQoImludGwiKSk7aWYobyl7eD1vLmxlbmd0aDtmb3IoaD0wO2g8eDtoKyspaWYoIXZbb1toXV0pe2lmKCFjLl9hdHRhY2gobykpcmV0dXJuITE7YnJlYWt9fWlmKGEpZm9yKGg9MDtoPGEubGVuZ3RoO2grKylpZighdlthW2hdXSl7aWYoIWMuX2F0dGFjaChhLCEwKSlyZXR1cm4hMTticmVha31pZihpLmZuKXtFPVtjLHJdO2lmKFMpe2s9e30sQz17fSxFLnB1c2goayxDKTtpZihvKXt4PW8ubGVuZ3RoO2ZvcihoPTA7aDx4O2grKylrW29baF1dPW0uaGFzT3duUHJvcGVydHkob1toXSk/bVtvW2hdXTpjfX1pZihjLmNvbmZpZy50aHJvd0ZhaWwpQz1pLmZuCi5hcHBseShTP3VuZGVmaW5lZDppLEUpO2Vsc2UgdHJ5e0M9aS5mbi5hcHBseShTP3VuZGVmaW5lZDppLEUpfWNhdGNoKEwpe3JldHVybiBjLmVycm9yKCJBdHRhY2ggZXJyb3I6ICIrcixMLHIpLCExfVMmJihtW3JdPUMsTj1pLmRldGFpbHMuY29uZGl0aW9uLE4mJk4ud2hlbj09PSJpbnN0ZWFkIiYmKG1bTi50cmlnZ2VyXT1DKSl9aWYodSlmb3IoaD0wO2g8dS5sZW5ndGg7aCsrKWlmKCF2W3VbaF1dKXtpZighYy5fYXR0YWNoKHUpKXJldHVybiExO2JyZWFrfX19cmV0dXJuITB9LF9kZWxheUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPVsiZXZlbnQtYmFzZSJdO3JldHVybiB0PW4uTGFuZy5pc09iamVjdCh0KT90OntldmVudDp0fSx0LmV2ZW50PT09ImxvYWQiJiZyLnB1c2goImV2ZW50LXN5bnRoZXRpYyIpLGZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzO24uX3VzZShyLGZ1bmN0aW9uKCl7bi5vbih0LmV2ZW50LGZ1bmN0aW9uKCl7aVsxXS5kZWxheVVudGlsPXQuZXZlbnQsZS5hcHBseShuLGkpfSx0LmFyZ3MpfSl9fSx1c2U6ZnVuY3Rpb24oKXt2YXIgZT1hLmNhbGwoYXJndW1lbnRzLDApLHQ9ZVtlLmxlbmd0aC0xXSxuPXRoaXMscj0wLGkscz1uLkVudixvPSEwO24uTGFuZy5pc0Z1bmN0aW9uKHQpPyhlLnBvcCgpLG4uY29uZmlnLmRlbGF5VW50aWwmJih0PW4uX2RlbGF5Q2FsbGJhY2sodCxuLmNvbmZpZy5kZWxheVVudGlsKSkpOnQ9bnVsbCxuLkxhbmcuaXNBcnJheShlWzBdKSYmKGU9ZVswXSk7aWYobi5jb25maWcuY2FjaGVVc2Upe3doaWxlKGk9ZVtyKytdKWlmKCFzLl9hdHRhY2hlZFtpXSl7bz0hMTticmVha31pZihvKXJldHVybiBlLmxlbmd0aCxuLl9ub3RpZnkodCx4LGUpLG59cmV0dXJuIG4uX2xvYWRpbmc/KG4uX3VzZVF1ZXVlPW4uX3VzZVF1ZXVlfHxuZXcgbi5RdWV1ZSxuLl91c2VRdWV1ZS5hZGQoW2UsdF0pKTpuLl91c2UoZSxmdW5jdGlvbihuLHIpe24uX25vdGlmeSh0LHIsZSl9KSxufSxyZXF1aXJlOmZ1bmN0aW9uKCl7dmFyIGU9YS5jYWxsKGFyZ3VtZW50cyksdDt0eXBlb2YgZVtlLmxlbmd0aC0xXT09ImZ1bmN0aW9uIiYmKHQ9ZS5wb3AoKSxlLnB1c2goZnVuY3Rpb24obil7dmFyIHIsaT1lLmxlbmd0aCxzPW4uRW52Ll9leHBvcnRlZCxvPXt9O2ZvcihyPTA7cjxpO3IrKylzLmhhc093blByb3BlcnR5KGVbcl0pJiYob1tlW3JdXT1zW2Vbcl1dKTt0LmNhbGwodW5kZWZpbmVkLG4sbyl9KSksdGhpcy51c2UuYXBwbHkodGhpcyxlKX0sX25vdGlmeTpmdW5jdGlvbihlLHQsbil7aWYoIXQuc3VjY2VzcyYmdGhpcy5jb25maWcubG9hZEVycm9yRm4pdGhpcy5jb25maWcubG9hZEVycm9yRm4uY2FsbCh0aGlzLHRoaXMsZSx0LG4pO2Vsc2UgaWYoZSl7dGhpcy5FbnYuX21pc3NlZCYmdGhpcy5FbnYuX21pc3NlZC5sZW5ndGgmJih0Lm1zZz0iTWlzc2luZyBtb2R1bGVzOiAiK3RoaXMuRW52Ll9taXNzZWQuam9pbigpLHQuc3VjY2Vzcz0hMSk7aWYodGhpcy5jb25maWcudGhyb3dGYWlsKWUodGhpcyx0KTtlbHNlIHRyeXtlKHRoaXMsdCl9Y2F0Y2gocil7dGhpcy5lcnJvcigidXNlIGNhbGxiYWNrIGVycm9yIixyLG4pfX19LF91c2U6ZnVuY3Rpb24oZSx0KXt0aGlzLkFycmF5fHx0aGlzLl9hdHRhY2goWyJ5dWktYmFzZSJdKTt2YXIgcixpLHMsbz10aGlzLHU9WVVJLkVudixhPXUubW9kcyxmPW8uRW52LGw9Zi5fdXNlZCxjPXUuYWxpYXNlcyxoPXUuX2xvYWRlclF1ZXVlLHA9ZVswXSxkPW8uQXJyYXksdj1vLmNvbmZpZyxtPXYuYm9vdHN0cmFwLGc9W10seSxiPVtdLHc9ITAsUz12LmZldGNoQ1NTLHg9ZnVuY3Rpb24oZSx0KXt2YXIgcj0wLGk9W10scyxvLGYsaCxwO2lmKCFlLmxlbmd0aClyZXR1cm47aWYoYyl7bz1lLmxlbmd0aDtmb3Iocj0wO3I8bztyKyspY1tlW3JdXSYmIWFbZVtyXV0/aT1bXS5jb25jYXQoaSxjW2Vbcl1dKTppLnB1c2goZVtyXSk7ZT1pfW89ZS5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKXtzPWVbcl0sdHx8Yi5wdXNoKHMpO2lmKGxbc10pY29udGludWU7Zj1hW3NdLGg9bnVsbCxwPW51bGwsZj8obFtzXT0hMCxoPWYuZGV0YWlscy5yZXF1aXJlcyxwPWYuZGV0YWlscy51c2UpOnUuX2xvYWRlZFtuXVtzXT9sW3NdPSEwOmcucHVzaChzKSxoJiZoLmxlbmd0aCYmeChoKSxwJiZwLmxlbmd0aCYmeChwLDEpfX0sVD1mdW5jdGlvbihuKXt2YXIgcj1ufHx7c3VjY2VzczohMCxtc2c6Im5vdCBkeW5hbWljIn0saSxzLHU9ITAsYT1yLmRhdGE7by5fbG9hZGluZz0hMSxhJiYocz1nLGc9W10sYj1bXSx4KGEpLGk9Zy5sZW5ndGgsaSYmW10uY29uY2F0KGcpLnNvcnQoKS5qb2luKCk9PXMuc29ydCgpLmpvaW4oKSYmKGk9ITEpKSxpJiZhPyhvLl9sb2FkaW5nPSEwLG8uX3VzZShnLGZ1bmN0aW9uKCl7by5fYXR0YWNoKGEpJiZvLl9ub3RpZnkodCxyLGEpfSkpOihhJiYodT1vLl9hdHRhY2goYSkpLHUmJm8uX25vdGlmeSh0LHIsZSkpLG8uX3VzZVF1ZXVlJiZvLl91c2VRdWV1ZS5zaXplKCkmJiFvLl9sb2FkaW5nJiZvLl91c2UuYXBwbHkobyxvLl91c2VRdWV1ZS5uZXh0KCkpfTtpZihwPT09IioiKXtlPVtdO2Zvcih5IGluIGEpYS5oYXNPd25Qcm9wZXJ0eSh5KSYmZS5wdXNoKHkpO3JldHVybiB3PW8uX2F0dGFjaChlKSx3JiZUKCksb31yZXR1cm4oYS5sb2FkZXJ8fGFbImxvYWRlci1iYXNlIl0pJiYhby5Mb2FkZXImJm8uX2F0dGFjaChbImxvYWRlciIrKGEubG9hZGVyPyIiOiItYmFzZSIpXSksbSYmby5Mb2FkZXImJmUubGVuZ3RoJiYoaT1FKG8pLGkucmVxdWlyZShlKSxpLmlnbm9yZVJlZ2lzdGVyZWQ9ITAsaS5fYm9vdD0hMCxpLmNhbGN1bGF0ZShudWxsLFM/bnVsbDoianMiKSxlPWkuc29ydGVkLGkuX2Jvb3Q9ITEpLHgoZSkscj1nLmxlbmd0aCxyJiYoZz1kLmRlZHVwZShnKSxyPWcubGVuZ3RoKSxtJiZyJiZvLkxvYWRlcj8oby5fbG9hZGluZz0hMCxpPUUobyksaS5vbkVuZD1ULGkuY29udGV4dD1vLGkuZGF0YT1lLGkuaWdub3JlUmVnaXN0ZXJlZD0hMSxpLnJlcXVpcmUoZyksaS5pbnNlcnQobnVsbCxTP251bGw6ImpzIikpOm0mJnImJm8uR2V0JiYhZi5ib290c3RyYXBwZWQ/KG8uX2xvYWRpbmc9ITAscz1mdW5jdGlvbigpe28uX2xvYWRpbmc9ITEsaC5ydW5uaW5nPSExLGYuYm9vdHN0cmFwcGVkPSEwLHUuX2Jvb3RzdHJhcHBpbmc9ITEsby5fYXR0YWNoKFsibG9hZGVyIl0pJiZvLl91c2UoZSx0KX0sdS5fYm9vdHN0cmFwcGluZz9oLmFkZChzKToodS5fYm9vdHN0cmFwcGluZz0hMCxvLkdldC5zY3JpcHQodi5iYXNlK3YubG9hZGVyUGF0aCx7b25FbmQ6c30pKSk6KHc9by5fYXR0YWNoKGUpLHcmJlQoKSksb30sbmFtZXNwYWNlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLHQsbj0wLGkscyxvO2Zvcig7bjxlLmxlbmd0aDtuKyspe3Q9dGhpcyxvPWVbbl07aWYoby5pbmRleE9mKHIpPi0xKXtzPW8uc3BsaXQocik7Zm9yKGk9c1swXT09IllBSE9PIj8xOjA7aTxzLmxlbmd0aDtpKyspdFtzW2ldXT10W3NbaV1dfHx7fSx0PXRbc1tpXV19ZWxzZSB0W29dPXRbb118fHt9LHQ9dFtvXX1yZXR1cm4gdH0sbG9nOnUsbWVzc2FnZTp1LGR1bXA6ZnVuY3Rpb24oZSl7cmV0dXJuIiIrZX0sZXJyb3I6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMsaTtyLmNvbmZpZy5lcnJvckZuJiYoaT1yLmNvbmZpZy5lcnJvckZuLmFwcGx5KHIsYXJndW1lbnRzKSk7aWYoIWkpdGhyb3cgdHx8bmV3IEVycm9yKGUpO3JldHVybiByLm1lc3NhZ2UoZSwiZXJyb3IiLCIiK24pLHJ9LGd1aWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5FbnYuX2d1aWRwKyJfIisgKyt0aGlzLkVudi5fdWlkeDtyZXR1cm4gZT9lK3Q6dH0sc3RhbXA6ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZighZSlyZXR1cm4gZTtlLnVuaXF1ZUlEJiZlLm5vZGVUeXBlJiZlLm5vZGVUeXBlIT09OT9uPWUudW5pcXVlSUQ6bj10eXBlb2YgZT09InN0cmluZyI/ZTplLl95dWlkO2lmKCFuKXtuPXRoaXMuZ3VpZCgpO2lmKCF0KXRyeXtlLl95dWlkPW59Y2F0Y2gocil7bj1udWxsfX1yZXR1cm4gbn0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5FdmVudCYmZS5FdmVudC5fdW5sb2FkKCksZGVsZXRlIHZbZS5pZF0sZGVsZXRlIGUuRW52LGRlbGV0ZSBlLmNvbmZpZ319LFlVSS5wcm90b3R5cGU9ZTtmb3IodCBpbiBlKWUuaGFzT3duUHJvcGVydHkodCkmJihZVUlbdF09ZVt0XSk7WVVJLmFwcGx5Q29uZmlnPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybjtZVUkuR2xvYmFsQ29uZmlnJiZ0aGlzLnByb3RvdHlwZS5hcHBseUNvbmZpZy5jYWxsKHRoaXMsWVVJLkdsb2JhbENvbmZpZyksdGhpcy5wcm90b3R5cGUuYXBwbHlDb25maWcuY2FsbCh0aGlzLGUpLFlVSS5HbG9iYWxDb25maWc9dGhpcy5jb25maWd9LFlVSS5faW5pdCgpLGw/KGcoaCwiRE9NQ29udGVudExvYWRlZCIsYiksZyh3aW5kb3csImxvYWQiLHcpKTooYigpLHcoKSksWVVJLkVudi5hZGQ9ZyxZVUkuRW52LnJlbW92ZT15LHR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmKGV4cG9ydHMuWVVJPVlVSSxZVUkuc2V0TG9hZEhvb2s9ZnVuY3Rpb24oZSl7WVVJLl9nZXRMb2FkSG9vaz1lfSxZVUkuX2dldExvYWRIb29rPW51bGwpLFlVSS5FbnZbbl09e319KSgpLFlVSS5hZGQoInl1aS1iYXNlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG0oZSx0LG4pe3ZhciByLGk7dHx8KHQ9MCk7aWYobnx8bS50ZXN0KGUpKXRyeXtyZXR1cm4gZC5zbGljZS5jYWxsKGUsdCl9Y2F0Y2gocyl7aT1bXTtmb3Iocj1lLmxlbmd0aDt0PHI7Kyt0KWkucHVzaChlW3RdKTtyZXR1cm4gaX1yZXR1cm5bZV19ZnVuY3Rpb24gZygpe3RoaXMuX2luaXQoKSx0aGlzLmFkZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIG49ZS5MYW5nfHwoZS5MYW5nPXt9KSxyPVN0cmluZy5wcm90b3R5cGUsaT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHM9eyJ1bmRlZmluZWQiOiJ1bmRlZmluZWQiLG51bWJlcjoibnVtYmVyIiwiYm9vbGVhbiI6ImJvb2xlYW4iLHN0cmluZzoic3RyaW5nIiwiW29iamVjdCBGdW5jdGlvbl0iOiJmdW5jdGlvbiIsIltvYmplY3QgUmVnRXhwXSI6InJlZ2V4cCIsIltvYmplY3QgQXJyYXldIjoiYXJyYXkiLCJbb2JqZWN0IERhdGVdIjoiZGF0ZSIsIltvYmplY3QgRXJyb3JdIjoiZXJyb3IifSxvPS9ce1xzKihbXnx9XSs/KVxzKig/Olx8KFtefV0qKSk/XHMqXH0vZyx1PSIJXG4LXGZcciBcdTAwYTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMjhcdTIwMjlcdTIwMmZcdTIwNWZcdTMwMDBcdWZlZmYiLGE9IlsJLVxyIFx1MDBhMFx1MTY4MFx1MTgwZVx1MjAwMC1cdTIwMGFcdTIwMjhcdTIwMjlcdTIwMmZcdTIwNWZcdTMwMDBcdWZlZmZdKyIsZj1uZXcgUmVnRXhwKCJeIithKSxsPW5ldyBSZWdFeHAoYSsiJCIpLGM9bmV3IFJlZ0V4cChmLnNvdXJjZSsifCIrbC5zb3VyY2UsImciKSxoPS9ce1xzKlxbKD86bmF0aXZlIGNvZGV8ZnVuY3Rpb24pXF1ccypcfS9pO24uX2lzTmF0aXZlPWZ1bmN0aW9uKHQpe3JldHVybiEhKGUuY29uZmlnLnVzZU5hdGl2ZUVTNSYmdCYmaC50ZXN0KHQpKX0sbi5pc0FycmF5PW4uX2lzTmF0aXZlKEFycmF5LmlzQXJyYXkpP0FycmF5LmlzQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIG4udHlwZShlKT09PSJhcnJheSJ9LG4uaXNCb29sZWFuPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09ImJvb2xlYW4ifSxuLmlzRGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbi50eXBlKGUpPT09ImRhdGUiJiZlLnRvU3RyaW5nKCkhPT0iSW52YWxpZCBEYXRlIiYmIWlzTmFOKGUpfSxuLmlzRnVuY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuIG4udHlwZShlKT09PSJmdW5jdGlvbiJ9LG4uaXNOdWxsPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09bnVsbH0sbi5pc051bWJlcj1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJudW1iZXIiJiZpc0Zpbml0ZShlKX0sbi5pc09iamVjdD1mdW5jdGlvbihlLHQpe3ZhciByPXR5cGVvZiBlO3JldHVybiBlJiYocj09PSJvYmplY3QifHwhdCYmKHI9PT0iZnVuY3Rpb24ifHwKbi5pc0Z1bmN0aW9uKGUpKSl8fCExfSxuLmlzUmVnRXhwPWZ1bmN0aW9uKGUpe3JldHVybiBuLnR5cGUoZSk9PT0icmVnZXhwIn0sbi5pc1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmcifSxuLmlzVW5kZWZpbmVkPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09InVuZGVmaW5lZCJ9LG4uaXNWYWx1ZT1mdW5jdGlvbihlKXt2YXIgdD1uLnR5cGUoZSk7c3dpdGNoKHQpe2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUoZSk7Y2FzZSJudWxsIjpjYXNlInVuZGVmaW5lZCI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hIXR9fSxuLm5vdz1EYXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sbi5zdWI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5yZXBsYWNlP2UucmVwbGFjZShvLGZ1bmN0aW9uKGUscil7cmV0dXJuIG4uaXNVbmRlZmluZWQodFtyXSk/ZTp0W3JdfSk6ZX0sbi50cmltPW4uX2lzTmF0aXZlKHIudHJpbSkmJiF1LnRyaW0oKT9mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS50cmltP2UudHJpbSgpOmV9OmZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gZS5yZXBsYWNlKGMsIiIpfWNhdGNoKHQpe3JldHVybiBlfX0sbi50cmltTGVmdD1uLl9pc05hdGl2ZShyLnRyaW1MZWZ0KSYmIXUudHJpbUxlZnQoKT9mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltTGVmdCgpfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGYsIiIpfSxuLnRyaW1SaWdodD1uLl9pc05hdGl2ZShyLnRyaW1SaWdodCkmJiF1LnRyaW1SaWdodCgpP2Z1bmN0aW9uKGUpe3JldHVybiBlLnRyaW1SaWdodCgpfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGwsIiIpfSxuLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHNbdHlwZW9mIGVdfHxzW2kuY2FsbChlKV18fChlPyJvYmplY3QiOiJudWxsIil9O3ZhciBwPWUuTGFuZyxkPUFycmF5LnByb3RvdHlwZSx2PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZS5BcnJheT1tLG0uZGVkdXBlPXAuX2lzTmF0aXZlKE9iamVjdC5jcmVhdGUpP2Z1bmN0aW9uKGUpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCksbj1bXSxyLGkscztmb3Iocj0wLHM9ZS5sZW5ndGg7cjxzOysrcilpPWVbcl0sdFtpXXx8KHRbaV09MSxuLnB1c2goaSkpO3JldHVybiBufTpmdW5jdGlvbihlKXt2YXIgdD17fSxuPVtdLHIsaSxzO2ZvcihyPTAscz1lLmxlbmd0aDtyPHM7KytyKWk9ZVtyXSx2LmNhbGwodCxpKXx8KHRbaV09MSxuLnB1c2goaSkpO3JldHVybiBufSxtLmVhY2g9bS5mb3JFYWNoPXAuX2lzTmF0aXZlKGQuZm9yRWFjaCk/ZnVuY3Rpb24odCxuLHIpe3JldHVybiBkLmZvckVhY2guY2FsbCh0fHxbXSxuLHJ8fGUpLGV9OmZ1bmN0aW9uKHQsbixyKXtmb3IodmFyIGk9MCxzPXQmJnQubGVuZ3RofHwwO2k8czsrK2kpaSBpbiB0JiZuLmNhbGwocnx8ZSx0W2ldLGksdCk7cmV0dXJuIGV9LG0uaGFzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXt9LHI9dCYmdC5sZW5ndGh8fDAsaSxzO2ZvcihpPTAscz1lLmxlbmd0aDtpPHM7KytpKWkgaW4gZSYmKG5bZVtpXV09cj5pJiZpIGluIHQ/dFtpXTohMCk7cmV0dXJuIG59LG0uaW5kZXhPZj1wLl9pc05hdGl2ZShkLmluZGV4T2YpP2Z1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZC5pbmRleE9mLmNhbGwoZSx0LG4pfTpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5sZW5ndGg7bj0rbnx8MCxuPShuPjB8fC0xKSpNYXRoLmZsb29yKE1hdGguYWJzKG4pKSxuPDAmJihuKz1yLG48MCYmKG49MCkpO2Zvcig7bjxyOysrbilpZihuIGluIGUmJmVbbl09PT10KXJldHVybiBuO3JldHVybi0xfSxtLm51bWVyaWNTb3J0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0sbS5zb21lPXAuX2lzTmF0aXZlKGQuc29tZSk/ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBkLnNvbWUuY2FsbChlLHQsbil9OmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPWUubGVuZ3RoO3I8aTsrK3IpaWYociBpbiBlJiZ0LmNhbGwobixlW3JdLHIsZSkpcmV0dXJuITA7cmV0dXJuITF9LG0udGVzdD1mdW5jdGlvbihlKXt2YXIgdD0wO2lmKHAuaXNBcnJheShlKSl0PTE7ZWxzZSBpZihwLmlzT2JqZWN0KGUpKXRyeXsibGVuZ3RoImluIGUmJiFlLnRhZ05hbWUmJighZS5zY3JvbGxUb3x8IWUuZG9jdW1lbnQpJiYhZS5hcHBseSYmKHQ9Mil9Y2F0Y2gobil7fXJldHVybiB0fSxnLnByb3RvdHlwZT17X2luaXQ6ZnVuY3Rpb24oKXt0aGlzLl9xPVtdfSxuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Euc2hpZnQoKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9xLnBvcCgpfSxhZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcS5wdXNoLmFwcGx5KHRoaXMuX3EsYXJndW1lbnRzKSx0aGlzfSxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3EubGVuZ3RofX0sZS5RdWV1ZT1nLFlVSS5FbnYuX2xvYWRlclF1ZXVlPVlVSS5FbnYuX2xvYWRlclF1ZXVlfHxuZXcgZzt2YXIgeT0iX18iLHY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxiPWUuTGFuZy5pc09iamVjdDtlLmNhY2hlZD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHR8fCh0PXt9KSxmdW5jdGlvbihyKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjE/QXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMseSk6U3RyaW5nKHIpO2lmKCEoaSBpbiB0KXx8biYmdFtpXT09bil0W2ldPWUuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiB0W2ldfX0sZS5nZXRMb2NhdGlvbj1mdW5jdGlvbigpe3ZhciB0PWUuY29uZmlnLndpbjtyZXR1cm4gdCYmdC5sb2NhdGlvbn0sZS5tZXJnZT1mdW5jdGlvbigpe3ZhciBlPTAsdD1hcmd1bWVudHMubGVuZ3RoLG49e30scixpO2Zvcig7ZTx0OysrZSl7aT1hcmd1bWVudHNbZV07Zm9yKHIgaW4gaSl2LmNhbGwoaSxyKSYmKG5bcl09aVtyXSl9cmV0dXJuIG59LGUubWl4PWZ1bmN0aW9uKHQsbixyLGkscyxvKXt2YXIgdSxhLGYsbCxjLGgscDtpZighdHx8IW4pcmV0dXJuIHR8fGU7aWYocyl7cz09PTImJmUubWl4KHQucHJvdG90eXBlLG4ucHJvdG90eXBlLHIsaSwwLG8pLGY9cz09PTF8fHM9PT0zP24ucHJvdG90eXBlOm4scD1zPT09MXx8cz09PTQ/dC5wcm90b3R5cGU6dDtpZighZnx8IXApcmV0dXJuIHR9ZWxzZSBmPW4scD10O3U9ciYmIW87aWYoaSlmb3IobD0wLGg9aS5sZW5ndGg7bDxoOysrbCl7Yz1pW2xdO2lmKCF2LmNhbGwoZixjKSljb250aW51ZTthPXU/ITE6YyBpbiBwO2lmKG8mJmEmJmIocFtjXSwhMCkmJmIoZltjXSwhMCkpZS5taXgocFtjXSxmW2NdLHIsbnVsbCwwLG8pO2Vsc2UgaWYocnx8IWEpcFtjXT1mW2NdfWVsc2V7Zm9yKGMgaW4gZil7aWYoIXYuY2FsbChmLGMpKWNvbnRpbnVlO2E9dT8hMTpjIGluIHA7aWYobyYmYSYmYihwW2NdLCEwKSYmYihmW2NdLCEwKSllLm1peChwW2NdLGZbY10scixudWxsLDAsbyk7ZWxzZSBpZihyfHwhYSlwW2NdPWZbY119ZS5PYmplY3QuX2hhc0VudW1CdWcmJmUubWl4KHAsZixyLGUuT2JqZWN0Ll9mb3JjZUVudW0scyxvKX1yZXR1cm4gdH07dmFyIHA9ZS5MYW5nLHY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx3LEU9ZS5PYmplY3Q9cC5faXNOYXRpdmUoT2JqZWN0LmNyZWF0ZSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5jcmVhdGUoZSl9OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucHJvdG90eXBlPXQsbmV3IGV9fSgpLFM9RS5fZm9yY2VFbnVtPVsiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJ0b1N0cmluZyIsInRvTG9jYWxlU3RyaW5nIiwidmFsdWVPZiJdLHg9RS5faGFzRW51bUJ1Zz0he3ZhbHVlT2Y6MH0ucHJvcGVydHlJc0VudW1lcmFibGUoInZhbHVlT2YiKSxUPUUuX2hhc1Byb3RvRW51bUJ1Zz1mdW5jdGlvbigpe30ucHJvcGVydHlJc0VudW1lcmFibGUoInByb3RvdHlwZSIpLE49RS5vd25zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuISFlJiZ2LmNhbGwoZSx0KX07RS5oYXNLZXk9TixFLmtleXM9cC5faXNOYXRpdmUoT2JqZWN0LmtleXMpJiYhVD9PYmplY3Qua2V5czpmdW5jdGlvbihlKXtpZighcC5pc09iamVjdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Iik7dmFyIHQ9W10sbixyLGk7aWYoVCYmdHlwZW9mIGU9PSJmdW5jdGlvbiIpZm9yKHIgaW4gZSlOKGUscikmJnIhPT0icHJvdG90eXBlIiYmdC5wdXNoKHIpO2Vsc2UgZm9yKHIgaW4gZSlOKGUscikmJnQucHVzaChyKTtpZih4KWZvcihuPTAsaT1TLmxlbmd0aDtuPGk7KytuKXI9U1tuXSxOKGUscikmJnQucHVzaChyKTtyZXR1cm4gdH0sRS52YWx1ZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9RS5rZXlzKGUpLG49MCxyPXQubGVuZ3RoLGk9W107Zm9yKDtuPHI7KytuKWkucHVzaChlW3Rbbl1dKTtyZXR1cm4gaX0sRS5zaXplPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gRS5rZXlzKGUpLmxlbmd0aH1jYXRjaCh0KXtyZXR1cm4gMH19LEUuaGFzVmFsdWU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5BcnJheS5pbmRleE9mKEUudmFsdWVzKHQpLG4pPi0xfSxFLmVhY2g9ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM7Zm9yKHMgaW4gdCkoaXx8Tih0LHMpKSYmbi5jYWxsKHJ8fGUsdFtzXSxzLHQpO3JldHVybiBlfSxFLnNvbWU9ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM7Zm9yKHMgaW4gdClpZihpfHxOKHQscykpaWYobi5jYWxsKHJ8fGUsdFtzXSxzLHQpKXJldHVybiEwO3JldHVybiExfSxFLmdldFZhbHVlPWZ1bmN0aW9uKHQsbil7aWYoIXAuaXNPYmplY3QodCkpcmV0dXJuIHc7dmFyIHIsaT1lLkFycmF5KG4pLHM9aS5sZW5ndGg7Zm9yKHI9MDt0IT09dyYmcjxzO3IrKyl0PXRbaVtyXV07cmV0dXJuIHR9LEUuc2V0VmFsdWU9ZnVuY3Rpb24odCxuLHIpe3ZhciBpLHM9ZS5BcnJheShuKSxvPXMubGVuZ3RoLTEsdT10O2lmKG8+PTApe2ZvcihpPTA7dSE9PXcmJmk8bztpKyspdT11W3NbaV1dO2lmKHU9PT13KXJldHVybiB3O3Vbc1tpXV09cn1yZXR1cm4gdH0sRS5pc0VtcHR5PWZ1bmN0aW9uKGUpe3JldHVybiFFLmtleXMoT2JqZWN0KGUpKS5sZW5ndGh9LFlVSS5FbnYucGFyc2VVQT1mdW5jdGlvbih0KXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD0wO3JldHVybiBwYXJzZUZsb2F0KGUucmVwbGFjZSgvXC4vZyxmdW5jdGlvbigpe3JldHVybiB0Kys9PT0xPyIiOiIuIn0pKX0scj1lLmNvbmZpZy53aW4saT1yJiZyLm5hdmlnYXRvcixzPXtpZTowLG9wZXJhOjAsZ2Vja286MCx3ZWJraXQ6MCxzYWZhcmk6MCxjaHJvbWU6MCxtb2JpbGU6bnVsbCxhaXI6MCxwaGFudG9tanM6MCxpcGFkOjAsaXBob25lOjAsaXBvZDowLGlvczpudWxsLGFuZHJvaWQ6MCxzaWxrOjAsdWJ1bnR1OjAsYWNjZWw6ITEsd2Vib3M6MCxjYWphOmkmJmkuY2FqYVZlcnNpb24sc2VjdXJlOiExLG9zOm51bGwsbm9kZWpzOjAsd2luanM6dHlwZW9mIFdpbmRvd3MhPSJ1bmRlZmluZWQiJiYhIVdpbmRvd3MuU3lzdGVtLHRvdWNoRW5hYmxlZDohMX0sbz10fHxpJiZpLnVzZXJBZ2VudCx1PXImJnIubG9jYXRpb24sYT11JiZ1LmhyZWYsZjtyZXR1cm4gcy51c2VyQWdlbnQ9byxzLnNlY3VyZT1hJiZhLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHMiKT09PTAsbyYmKC93aW5kb3dzfHdpbjMyL2kudGVzdChvKT9zLm9zPSJ3aW5kb3dzIjovbWFjaW50b3NofG1hY19wb3dlcnBjL2kudGVzdChvKT9zLm9zPSJtYWNpbnRvc2giOi9hbmRyb2lkL2kudGVzdChvKT9zLm9zPSJhbmRyb2lkIjovc3ltYm9zL2kudGVzdChvKT9zLm9zPSJzeW1ib3MiOi9saW51eC9pLnRlc3Qobyk/cy5vcz0ibGludXgiOi9yaGluby9pLnRlc3QobykmJihzLm9zPSJyaGlubyIpLC9LSFRNTC8udGVzdChvKSYmKHMud2Via2l0PTEpLC9JRU1vYmlsZXxYQkxXUDcvLnRlc3QobykmJihzLm1vYmlsZT0id2luZG93cyIpLC9GZW5uZWMvLnRlc3QobykmJihzLm1vYmlsZT0iZ2Vja28iKSxmPW8ubWF0Y2goL0FwcGxlV2ViS2l0XC8oW15cc10qKS8pLGYmJmZbMV0mJihzLgp3ZWJraXQ9bihmWzFdKSxzLnNhZmFyaT1zLndlYmtpdCwvUGhhbnRvbUpTLy50ZXN0KG8pJiYoZj1vLm1hdGNoKC9QaGFudG9tSlNcLyhbXlxzXSopLyksZiYmZlsxXSYmKHMucGhhbnRvbWpzPW4oZlsxXSkpKSwvIE1vYmlsZVwvLy50ZXN0KG8pfHwvaVBhZHxpUG9kfGlQaG9uZS8udGVzdChvKT8ocy5tb2JpbGU9IkFwcGxlIixmPW8ubWF0Y2goL09TIChbXlxzXSopLyksZiYmZlsxXSYmKGY9bihmWzFdLnJlcGxhY2UoIl8iLCIuIikpKSxzLmlvcz1mLHMub3M9ImlvcyIscy5pcGFkPXMuaXBvZD1zLmlwaG9uZT0wLGY9by5tYXRjaCgvaVBhZHxpUG9kfGlQaG9uZS8pLGYmJmZbMF0mJihzW2ZbMF0udG9Mb3dlckNhc2UoKV09cy5pb3MpKTooZj1vLm1hdGNoKC9Ob2tpYU5bXlwvXSp8d2ViT1NcL1xkXC5cZC8pLGYmJihzLm1vYmlsZT1mWzBdKSwvd2ViT1MvLnRlc3QobykmJihzLm1vYmlsZT0iV2ViT1MiLGY9by5tYXRjaCgvd2ViT1NcLyhbXlxzXSopOy8pLGYmJmZbMV0mJihzLndlYm9zPW4oZlsxXSkpKSwvIEFuZHJvaWQvLnRlc3QobykmJigvTW9iaWxlLy50ZXN0KG8pJiYocy5tb2JpbGU9IkFuZHJvaWQiKSxmPW8ubWF0Y2goL0FuZHJvaWQgKFteXHNdKik7LyksZiYmZlsxXSYmKHMuYW5kcm9pZD1uKGZbMV0pKSksL1NpbGsvLnRlc3QobykmJihmPW8ubWF0Y2goL1NpbGtcLyhbXlxzXSopLyksZiYmZlsxXSYmKHMuc2lsaz1uKGZbMV0pKSxzLmFuZHJvaWR8fChzLmFuZHJvaWQ9Mi4zNCxzLm9zPSJBbmRyb2lkIiksL0FjY2VsZXJhdGVkPXRydWUvLnRlc3QobykmJihzLmFjY2VsPSEwKSkpLGY9by5tYXRjaCgvT1BSXC8oXGQrXC5cZCspLyksZiYmZlsxXT9zLm9wZXJhPW4oZlsxXSk6KGY9by5tYXRjaCgvKENocm9tZXxDck1vfENyaU9TKVwvKFteXHNdKikvKSxmJiZmWzFdJiZmWzJdPyhzLmNocm9tZT1uKGZbMl0pLHMuc2FmYXJpPTAsZlsxXT09PSJDck1vIiYmKHMubW9iaWxlPSJjaHJvbWUiKSk6KGY9by5tYXRjaCgvQWRvYmVBSVJcLyhbXlxzXSopLyksZiYmKHMuYWlyPWZbMF0pKSkpLGY9by5tYXRjaCgvVWJ1bnR1XCAoXGQrXC5cZCspLyksZiYmZlsxXSYmKHMub3M9ImxpbnV4IixzLnVidW50dT1uKGZbMV0pLGY9by5tYXRjaCgvXCBXZWJLaXRcLyhbXlxzXSopLyksZiYmZlsxXSYmKHMud2Via2l0PW4oZlsxXSkpLGY9by5tYXRjaCgvXCBDaHJvbWl1bVwvKFteXHNdKikvKSxmJiZmWzFdJiYocy5jaHJvbWU9bihmWzFdKSksLyBNb2JpbGUkLy50ZXN0KG8pJiYocy5tb2JpbGU9IlVidW50dSIpKSxzLndlYmtpdHx8KC9PcGVyYS8udGVzdChvKT8oZj1vLm1hdGNoKC9PcGVyYVtcc1wvXShbXlxzXSopLyksZiYmZlsxXSYmKHMub3BlcmE9bihmWzFdKSksZj1vLm1hdGNoKC9WZXJzaW9uXC8oW15cc10qKS8pLGYmJmZbMV0mJihzLm9wZXJhPW4oZlsxXSkpLC9PcGVyYSBNb2JpLy50ZXN0KG8pJiYocy5tb2JpbGU9Im9wZXJhIixmPW8ucmVwbGFjZSgiT3BlcmEgTW9iaSIsIiIpLm1hdGNoKC9PcGVyYSAoW15cc10qKS8pLGYmJmZbMV0mJihzLm9wZXJhPW4oZlsxXSkpKSxmPW8ubWF0Y2goL09wZXJhIE1pbmlbXjtdKi8pLGYmJihzLm1vYmlsZT1mWzBdKSk6KGY9by5tYXRjaCgvTVNJRSAoW147XSopfFRyaWRlbnQuKjsgcnY6KFswLTkuXSspLyksZiYmKGZbMV18fGZbMl0pP3MuaWU9bihmWzFdfHxmWzJdKTooZj1vLm1hdGNoKC9HZWNrb1wvKFteXHNdKikvKSxmJiYocy5nZWNrbz0xLGY9by5tYXRjaCgvcnY6KFteXHNcKV0qKS8pLGYmJmZbMV0mJihzLmdlY2tvPW4oZlsxXSksL01vYmlsZXxUYWJsZXQvLnRlc3QobykmJihzLm1vYmlsZT0iZmZvcyIpKSkpKSkpLHImJmkmJiEocy5jaHJvbWUmJnMuY2hyb21lPDYpJiYocy50b3VjaEVuYWJsZWQ9Im9udG91Y2hzdGFydCJpbiByfHwibXNNYXhUb3VjaFBvaW50cyJpbiBpJiZpLm1zTWF4VG91Y2hQb2ludHM+MCksdHx8KHR5cGVvZiBwcm9jZXNzPT0ib2JqZWN0IiYmcHJvY2Vzcy52ZXJzaW9ucyYmcHJvY2Vzcy52ZXJzaW9ucy5ub2RlJiYocy5vcz1wcm9jZXNzLnBsYXRmb3JtLHMubm9kZWpzPW4ocHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSksWVVJLkVudi5VQT1zKSxzfSxlLlVBPVlVSS5FbnYuVUF8fFlVSS5FbnYucGFyc2VVQSgpLGUuVUEuY29tcGFyZVZlcnNpb25zPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbyx1O2lmKGU9PT10KXJldHVybiAwO3I9KGUrIiIpLnNwbGl0KCIuIikscz0odCsiIikuc3BsaXQoIi4iKTtmb3Iobz0wLHU9TWF0aC5tYXgoci5sZW5ndGgscy5sZW5ndGgpO288dTsrK28pe249cGFyc2VJbnQocltvXSwxMCksaT1wYXJzZUludChzW29dLDEwKSxpc05hTihuKSYmKG49MCksaXNOYU4oaSkmJihpPTApO2lmKG48aSlyZXR1cm4tMTtpZihuPmkpcmV0dXJuIDF9cmV0dXJuIDB9LFlVSS5FbnYuYWxpYXNlcz17YW5pbTpbImFuaW0tYmFzZSIsImFuaW0tY29sb3IiLCJhbmltLWN1cnZlIiwiYW5pbS1lYXNpbmciLCJhbmltLW5vZGUtcGx1Z2luIiwiYW5pbS1zY3JvbGwiLCJhbmltLXh5Il0sImFuaW0tc2hhcGUtdHJhbnNmb3JtIjpbImFuaW0tc2hhcGUiXSxhcHA6WyJhcHAtYmFzZSIsImFwcC1jb250ZW50IiwiYXBwLXRyYW5zaXRpb25zIiwibGF6eS1tb2RlbC1saXN0IiwibW9kZWwiLCJtb2RlbC1saXN0IiwibW9kZWwtc3luYy1yZXN0IiwibW9kZWwtc3luYy1sb2NhbCIsInJvdXRlciIsInZpZXciLCJ2aWV3LW5vZGUtbWFwIl0sYXR0cmlidXRlOlsiYXR0cmlidXRlLWJhc2UiLCJhdHRyaWJ1dGUtY29tcGxleCJdLCJhdHRyaWJ1dGUtZXZlbnRzIjpbImF0dHJpYnV0ZS1vYnNlcnZhYmxlIl0sYXV0b2NvbXBsZXRlOlsiYXV0b2NvbXBsZXRlLWJhc2UiLCJhdXRvY29tcGxldGUtc291cmNlcyIsImF1dG9jb21wbGV0ZS1saXN0IiwiYXV0b2NvbXBsZXRlLXBsdWdpbiJdLGF4ZXM6WyJheGlzLW51bWVyaWMiLCJheGlzLWNhdGVnb3J5IiwiYXhpcy10aW1lIiwiYXhpcy1zdGFja2VkIl0sImF4ZXMtYmFzZSI6WyJheGlzLW51bWVyaWMtYmFzZSIsImF4aXMtY2F0ZWdvcnktYmFzZSIsImF4aXMtdGltZS1iYXNlIiwiYXhpcy1zdGFja2VkLWJhc2UiXSxiYXNlOlsiYmFzZS1iYXNlIiwiYmFzZS1wbHVnaW5ob3N0IiwiYmFzZS1idWlsZCJdLGNhY2hlOlsiY2FjaGUtYmFzZSIsImNhY2hlLW9mZmxpbmUiLCJjYWNoZS1wbHVnaW4iXSxjaGFydHM6WyJjaGFydHMtYmFzZSJdLGNvbGxlY3Rpb246WyJhcnJheS1leHRyYXMiLCJhcnJheWxpc3QiLCJhcnJheWxpc3QtYWRkIiwiYXJyYXlsaXN0LWZpbHRlciIsImFycmF5LWludm9rZSJdLGNvbG9yOlsiY29sb3ItYmFzZSIsImNvbG9yLWhzbCIsImNvbG9yLWhhcm1vbnkiXSxjb250cm9sbGVyOlsicm91dGVyIl0sZGF0YXNjaGVtYTpbImRhdGFzY2hlbWEtYmFzZSIsImRhdGFzY2hlbWEtanNvbiIsImRhdGFzY2hlbWEteG1sIiwiZGF0YXNjaGVtYS1hcnJheSIsImRhdGFzY2hlbWEtdGV4dCJdLGRhdGFzb3VyY2U6WyJkYXRhc291cmNlLWxvY2FsIiwiZGF0YXNvdXJjZS1pbyIsImRhdGFzb3VyY2UtZ2V0IiwiZGF0YXNvdXJjZS1mdW5jdGlvbiIsImRhdGFzb3VyY2UtY2FjaGUiLCJkYXRhc291cmNlLWpzb25zY2hlbWEiLCJkYXRhc291cmNlLXhtbHNjaGVtYSIsImRhdGFzb3VyY2UtYXJyYXlzY2hlbWEiLCJkYXRhc291cmNlLXRleHRzY2hlbWEiLCJkYXRhc291cmNlLXBvbGxpbmciXSxkYXRhdGFibGU6WyJkYXRhdGFibGUtY29yZSIsImRhdGF0YWJsZS10YWJsZSIsImRhdGF0YWJsZS1oZWFkIiwiZGF0YXRhYmxlLWJvZHkiLCJkYXRhdGFibGUtYmFzZSIsImRhdGF0YWJsZS1jb2x1bW4td2lkdGhzIiwiZGF0YXRhYmxlLW1lc3NhZ2UiLCJkYXRhdGFibGUtbXV0YWJsZSIsImRhdGF0YWJsZS1zb3J0IiwiZGF0YXRhYmxlLWRhdGFzb3VyY2UiXSxkYXRhdHlwZTpbImRhdGF0eXBlLWRhdGUiLCJkYXRhdHlwZS1udW1iZXIiLCJkYXRhdHlwZS14bWwiXSwiZGF0YXR5cGUtZGF0ZSI6WyJkYXRhdHlwZS1kYXRlLXBhcnNlIiwiZGF0YXR5cGUtZGF0ZS1mb3JtYXQiLCJkYXRhdHlwZS1kYXRlLW1hdGgiXSwiZGF0YXR5cGUtbnVtYmVyIjpbImRhdGF0eXBlLW51bWJlci1wYXJzZSIsImRhdGF0eXBlLW51bWJlci1mb3JtYXQiXSwiZGF0YXR5cGUteG1sIjpbImRhdGF0eXBlLXhtbC1wYXJzZSIsImRhdGF0eXBlLXhtbC1mb3JtYXQiXSxkZDpbImRkLWRkbS1iYXNlIiwiZGQtZGRtIiwiZGQtZGRtLWRyb3AiLCJkZC1kcmFnIiwiZGQtcHJveHkiLCJkZC1jb25zdHJhaW4iLCJkZC1kcm9wIiwiZGQtc2Nyb2xsIiwiZGQtZGVsZWdhdGUiXSxkb206WyJkb20tYmFzZSIsImRvbS1zY3JlZW4iLCJkb20tc3R5bGUiLCJzZWxlY3Rvci1uYXRpdmUiLCJzZWxlY3RvciJdLGVkaXRvcjpbImZyYW1lIiwiZWRpdG9yLXNlbGVjdGlvbiIsImV4ZWMtY29tbWFuZCIsImVkaXRvci1iYXNlIiwiZWRpdG9yLXBhcmEiLCJlZGl0b3ItYnIiLCJlZGl0b3ItYmlkaSIsImVkaXRvci10YWIiLCJjcmVhdGVsaW5rLWJhc2UiXSxldmVudDpbImV2ZW50LWJhc2UiLCJldmVudC1kZWxlZ2F0ZSIsImV2ZW50LXN5bnRoZXRpYyIsImV2ZW50LW1vdXNld2hlZWwiLCJldmVudC1tb3VzZWVudGVyIiwiZXZlbnQta2V5IiwiZXZlbnQtZm9jdXMiLCJldmVudC1yZXNpemUiLCJldmVudC1ob3ZlciIsImV2ZW50LW91dHNpZGUiLCJldmVudC10b3VjaCIsImV2ZW50LW1vdmUiLCJldmVudC1mbGljayIsImV2ZW50LXZhbHVlY2hhbmdlIiwiZXZlbnQtdGFwIl0sImV2ZW50LWN1c3RvbSI6WyJldmVudC1jdXN0b20tYmFzZSIsImV2ZW50LWN1c3RvbS1jb21wbGV4Il0sImV2ZW50LWdlc3R1cmVzIjpbImV2ZW50LWZsaWNrIiwiZXZlbnQtbW92ZSJdLGhhbmRsZWJhcnM6WyJoYW5kbGViYXJzLWNvbXBpbGVyIl0saGlnaGxpZ2h0OlsiaGlnaGxpZ2h0LWJhc2UiLCJoaWdobGlnaHQtYWNjZW50Zm9sZCJdLGhpc3Rvcnk6WyJoaXN0b3J5LWJhc2UiLCJoaXN0b3J5LWhhc2giLCJoaXN0b3J5LWh0bWw1Il0saW86WyJpby1iYXNlIiwiaW8teGRyIiwiaW8tZm9ybSIsImlvLXVwbG9hZC1pZnJhbWUiLCJpby1xdWV1ZSJdLGpzb246WyJqc29uLXBhcnNlIiwianNvbi1zdHJpbmdpZnkiXSxsb2FkZXI6WyJsb2FkZXItYmFzZSIsImxvYWRlci1yb2xsdXAiLCJsb2FkZXIteXVpMyJdLG5vZGU6WyJub2RlLWJhc2UiLCJub2RlLWV2ZW50LWRlbGVnYXRlIiwibm9kZS1wbHVnaW5ob3N0Iiwibm9kZS1zY3JlZW4iLCJub2RlLXN0eWxlIl0scGx1Z2luaG9zdDpbInBsdWdpbmhvc3QtYmFzZSIsInBsdWdpbmhvc3QtY29uZmlnIl0scXVlcnlzdHJpbmc6WyJxdWVyeXN0cmluZy1wYXJzZSIsInF1ZXJ5c3RyaW5nLXN0cmluZ2lmeSJdLHJlY29yZHNldDpbInJlY29yZHNldC1iYXNlIiwicmVjb3Jkc2V0LXNvcnQiLCJyZWNvcmRzZXQtZmlsdGVyIiwicmVjb3Jkc2V0LWluZGV4ZXIiXSxyZXNpemU6WyJyZXNpemUtYmFzZSIsInJlc2l6ZS1wcm94eSIsInJlc2l6ZS1jb25zdHJhaW4iXSxzbGlkZXI6WyJzbGlkZXItYmFzZSIsInNsaWRlci12YWx1ZS1yYW5nZSIsImNsaWNrYWJsZS1yYWlsIiwicmFuZ2Utc2xpZGVyIl0sdGVtcGxhdGU6WyJ0ZW1wbGF0ZS1iYXNlIiwidGVtcGxhdGUtbWljcm8iXSx0ZXh0OlsidGV4dC1hY2NlbnRmb2xkIiwidGV4dC13b3JkYnJlYWsiXSx3aWRnZXQ6WyJ3aWRnZXQtYmFzZSIsIndpZGdldC1odG1scGFyc2VyIiwid2lkZ2V0LXNraW4iLCJ3aWRnZXQtdWlldmVudHMiXX19LCIzLjE3LjIiLHt1c2U6WyJ5dWktYmFzZSIsImdldCIsImZlYXR1cmVzIiwiaW50bC1iYXNlIiwieXVpLWxvZyIsInl1aS1sYXRlciIsImxvYWRlci1iYXNlIiwibG9hZGVyLXJvbGx1cCIsImxvYWRlci15dWkzIl19KSxZVUkuYWRkKCJnZXQiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5MYW5nLHIsaSxzO2UuR2V0PWk9e2Nzc09wdGlvbnM6e2F0dHJpYnV0ZXM6e3JlbDoic3R5bGVzaGVldCJ9LGRvYzplLmNvbmZpZy5saW5rRG9jfHxlLmNvbmZpZy5kb2MscG9sbEludGVydmFsOjUwfSxqc09wdGlvbnM6e2F1dG9wdXJnZTohMCxkb2M6ZS5jb25maWcuc2NyaXB0RG9jfHxlLmNvbmZpZy5kb2N9LG9wdGlvbnMKOnthdHRyaWJ1dGVzOntjaGFyc2V0OiJ1dGYtOCJ9LHB1cmdldGhyZXNob2xkOjIwfSxSRUdFWF9DU1M6L1wuY3NzKD86Wz87XS4qKT8kL2ksUkVHRVhfSlM6L1wuanMoPzpbPztdLiopPyQvaSxfaW5zZXJ0Q2FjaGU6e30sX3BlbmRpbmc6bnVsbCxfcHVyZ2VOb2RlczpbXSxfcXVldWU6W10sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGkscztpZighZS5hYm9ydCl7bj1lLHM9dGhpcy5fcGVuZGluZyxlPW51bGw7aWYocyYmcy50cmFuc2FjdGlvbi5pZD09PW4pZT1zLnRyYW5zYWN0aW9uLHRoaXMuX3BlbmRpbmc9bnVsbDtlbHNlIGZvcih0PTAsaT10aGlzLl9xdWV1ZS5sZW5ndGg7dDxpOysrdCl7cj10aGlzLl9xdWV1ZVt0XS50cmFuc2FjdGlvbjtpZihyLmlkPT09bil7ZT1yLHRoaXMuX3F1ZXVlLnNwbGljZSh0LDEpO2JyZWFrfX19ZSYmZS5hYm9ydCgpfSxjc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLl9sb2FkKCJjc3MiLGUsdCxuKX0sanM6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLl9sb2FkKCJqcyIsZSx0LG4pfSxsb2FkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fbG9hZChudWxsLGUsdCxuKX0sX2F1dG9QdXJnZTpmdW5jdGlvbihlKXtlJiZ0aGlzLl9wdXJnZU5vZGVzLmxlbmd0aD49ZSYmdGhpcy5fcHVyZ2UodGhpcy5fcHVyZ2VOb2Rlcyl9LF9nZXRFbnY6ZnVuY3Rpb24oKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj1lLlVBO3JldHVybiB0aGlzLl9lbnY9e2FzeW5jOnQmJnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IikuYXN5bmM9PT0hMHx8bi5pZT49MTAsY3NzRmFpbDpuLmdlY2tvPj05fHxuLmNvbXBhcmVWZXJzaW9ucyhuLndlYmtpdCw1MzUuMjQpPj0wLGNzc0xvYWQ6KCFuLmdlY2tvJiYhbi53ZWJraXR8fG4uZ2Vja28+PTl8fG4uY29tcGFyZVZlcnNpb25zKG4ud2Via2l0LDUzNS4yNCk+PTApJiYhKG4uY2hyb21lJiZuLmNocm9tZTw9MTgpLHByZXNlcnZlc1NjcmlwdE9yZGVyOiEhKG4uZ2Vja298fG4ub3BlcmF8fG4uaWUmJm4uaWU+PTEwKX19LF9nZXRUcmFuc2FjdGlvbjpmdW5jdGlvbih0LHIpe3ZhciBpPVtdLG8sdSxhLGY7bi5pc0FycmF5KHQpfHwodD1bdF0pLHI9ZS5tZXJnZSh0aGlzLm9wdGlvbnMsciksci5hdHRyaWJ1dGVzPWUubWVyZ2UodGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMsci5hdHRyaWJ1dGVzKTtmb3Iobz0wLHU9dC5sZW5ndGg7bzx1Oysrbyl7Zj10W29dLGE9e2F0dHJpYnV0ZXM6e319O2lmKHR5cGVvZiBmPT0ic3RyaW5nIilhLnVybD1mO2Vsc2V7aWYoIWYudXJsKWNvbnRpbnVlO2UubWl4KGEsZiwhMSxudWxsLDAsITApLGY9Zi51cmx9ZS5taXgoYSxyLCExLG51bGwsMCwhMCksYS50eXBlfHwodGhpcy5SRUdFWF9DU1MudGVzdChmKT9hLnR5cGU9ImNzcyI6KCF0aGlzLlJFR0VYX0pTLnRlc3QoZiksYS50eXBlPSJqcyIpKSxlLm1peChhLGEudHlwZT09PSJqcyI/dGhpcy5qc09wdGlvbnM6dGhpcy5jc3NPcHRpb25zLCExLG51bGwsMCwhMCksYS5hdHRyaWJ1dGVzLmlkfHwoYS5hdHRyaWJ1dGVzLmlkPWUuZ3VpZCgpKSxhLndpbj9hLmRvYz1hLndpbi5kb2N1bWVudDphLndpbj1hLmRvYy5kZWZhdWx0Vmlld3x8YS5kb2MucGFyZW50V2luZG93LGEuY2hhcnNldCYmKGEuYXR0cmlidXRlcy5jaGFyc2V0PWEuY2hhcnNldCksaS5wdXNoKGEpfXJldHVybiBuZXcgcyhpLHIpfSxfbG9hZDpmdW5jdGlvbihlLHQsbixyKXt2YXIgcztyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiImJihyPW4sbj17fSksbnx8KG49e30pLG4udHlwZT1lLG4uX29uRmluaXNoPWkuX29uVHJhbnNhY3Rpb25GaW5pc2gsdGhpcy5fZW52fHx0aGlzLl9nZXRFbnYoKSxzPXRoaXMuX2dldFRyYW5zYWN0aW9uKHQsbiksdGhpcy5fcXVldWUucHVzaCh7Y2FsbGJhY2s6cix0cmFuc2FjdGlvbjpzfSksdGhpcy5fbmV4dCgpLHN9LF9vblRyYW5zYWN0aW9uRmluaXNoOmZ1bmN0aW9uKCl7aS5fcGVuZGluZz1udWxsLGkuX25leHQoKX0sX25leHQ6ZnVuY3Rpb24oKXt2YXIgZTtpZih0aGlzLl9wZW5kaW5nKXJldHVybjtlPXRoaXMuX3F1ZXVlLnNoaWZ0KCksZSYmKHRoaXMuX3BlbmRpbmc9ZSxlLnRyYW5zYWN0aW9uLmV4ZWN1dGUoZS5jYWxsYmFjaykpfSxfcHVyZ2U6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fcHVyZ2VOb2RlcyxyPXQhPT1uLGksczt3aGlsZShzPXQucG9wKCkpe2lmKCFzLl95dWlnZXRfZmluaXNoZWQpY29udGludWU7cy5wYXJlbnROb2RlJiZzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocyksciYmKGk9ZS5BcnJheS5pbmRleE9mKG4scyksaT4tMSYmbi5zcGxpY2UoaSwxKSl9fX0saS5zY3JpcHQ9aS5qcyxpLlRyYW5zYWN0aW9uPXM9ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzO3IuaWQ9cy5fbGFzdElkKz0xLHIuZGF0YT1uLmRhdGEsci5lcnJvcnM9W10sci5ub2Rlcz1bXSxyLm9wdGlvbnM9bixyLnJlcXVlc3RzPXQsci5fY2FsbGJhY2tzPVtdLHIuX3F1ZXVlPVtdLHIuX3JlcXNXYWl0aW5nPTAsci50SWQ9ci5pZCxyLndpbj1uLndpbnx8ZS5jb25maWcud2lufSxzLl9sYXN0SWQ9MCxzLnByb3RvdHlwZT17X3N0YXRlOiJuZXciLGFib3J0OmZ1bmN0aW9uKGUpe3RoaXMuX3BlbmRpbmc9bnVsbCx0aGlzLl9wZW5kaW5nQ1NTPW51bGwsdGhpcy5fcG9sbFRpbWVyPWNsZWFyVGltZW91dCh0aGlzLl9wb2xsVGltZXIpLHRoaXMuX3F1ZXVlPVtdLHRoaXMuX3JlcXNXYWl0aW5nPTAsdGhpcy5lcnJvcnMucHVzaCh7ZXJyb3I6ZXx8IkFib3J0ZWQifSksdGhpcy5fZmluaXNoKCl9LGV4ZWN1dGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXQucmVxdWVzdHMscj10Ll9zdGF0ZSxpLHMsbyx1O2lmKHI9PT0iZG9uZSIpe2UmJmUodC5lcnJvcnMubGVuZ3RoP3QuZXJyb3JzOm51bGwsdCk7cmV0dXJufWUmJnQuX2NhbGxiYWNrcy5wdXNoKGUpO2lmKHI9PT0iZXhlY3V0aW5nIilyZXR1cm47dC5fc3RhdGU9ImV4ZWN1dGluZyIsdC5fcXVldWU9bz1bXSx0Lm9wdGlvbnMudGltZW91dCYmKHQuX3RpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3QuYWJvcnQoIlRpbWVvdXQiKX0sdC5vcHRpb25zLnRpbWVvdXQpKSx0Ll9yZXFzV2FpdGluZz1uLmxlbmd0aDtmb3IoaT0wLHM9bi5sZW5ndGg7aTxzOysraSl1PW5baV0sdS5hc3luY3x8dS50eXBlPT09ImNzcyI/dC5faW5zZXJ0KHUpOm8ucHVzaCh1KTt0Ll9uZXh0KCl9LHB1cmdlOmZ1bmN0aW9uKCl7aS5fcHVyZ2UodGhpcy5ub2Rlcyl9LF9jcmVhdGVOb2RlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1uLmNyZWF0ZUVsZW1lbnQoZSkscyxvO3J8fChvPW4uY3JlYXRlRWxlbWVudCgiZGl2Iiksby5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiYSIpLHI9by5jbGFzc05hbWU9PT0iYSI/e306eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifSk7Zm9yKHMgaW4gdCl0Lmhhc093blByb3BlcnR5KHMpJiZpLnNldEF0dHJpYnV0ZShyW3NdfHxzLHRbc10pO3JldHVybiBpfSxfZmluaXNoOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lcnJvcnMubGVuZ3RoP3RoaXMuZXJyb3JzOm51bGwsdD10aGlzLm9wdGlvbnMsbj10LmNvbnRleHR8fHRoaXMscixpLHM7aWYodGhpcy5fc3RhdGU9PT0iZG9uZSIpcmV0dXJuO3RoaXMuX3N0YXRlPSJkb25lIjtmb3IoaT0wLHM9dGhpcy5fY2FsbGJhY2tzLmxlbmd0aDtpPHM7KytpKXRoaXMuX2NhbGxiYWNrc1tpXS5jYWxsKG4sZSx0aGlzKTtyPXRoaXMuX2dldEV2ZW50RGF0YSgpLGU/KHQub25UaW1lb3V0JiZlW2UubGVuZ3RoLTFdLmVycm9yPT09IlRpbWVvdXQiJiZ0Lm9uVGltZW91dC5jYWxsKG4sciksdC5vbkZhaWx1cmUmJnQub25GYWlsdXJlLmNhbGwobixyKSk6dC5vblN1Y2Nlc3MmJnQub25TdWNjZXNzLmNhbGwobixyKSx0Lm9uRW5kJiZ0Lm9uRW5kLmNhbGwobixyKSx0Ll9vbkZpbmlzaCYmdC5fb25GaW5pc2goKX0sX2dldEV2ZW50RGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gdD9lLm1lcmdlKHRoaXMse2Fib3J0OnRoaXMuYWJvcnQscHVyZ2U6dGhpcy5wdXJnZSxyZXF1ZXN0OnQsdXJsOnQudXJsLHdpbjp0Lndpbn0pOnRoaXN9LF9nZXRJbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCl7dmFyIG49dC5kb2Mscj10Lmluc2VydEJlZm9yZSxzLG87cmV0dXJuIHI/dHlwZW9mIHI9PSJzdHJpbmciP24uZ2V0RWxlbWVudEJ5SWQocik6cjoocz1pLl9pbnNlcnRDYWNoZSxvPWUuc3RhbXAobiksKHI9c1tvXSk/cjoocj1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIilbMF0pP3Nbb109cjoocj1uLmhlYWR8fG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSxyPyhyLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoIiIpKSxzW29dPXIubGFzdENoaWxkKTpzW29dPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpWzBdKSl9LF9pbnNlcnQ6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gYygpe3UuX3Byb2dyZXNzKCJGYWlsZWQgdG8gbG9hZCAiK3QudXJsLHQpfWZ1bmN0aW9uIGgoKXtmJiZjbGVhclRpbWVvdXQoZiksdS5fcHJvZ3Jlc3MobnVsbCx0KX12YXIgbj1pLl9lbnYscj10aGlzLl9nZXRJbnNlcnRCZWZvcmUodCkscz10LnR5cGU9PT0ianMiLG89dC5ub2RlLHU9dGhpcyxhPWUuVUEsZixsO298fChzP2w9InNjcmlwdCI6IW4uY3NzTG9hZCYmYS5nZWNrbz9sPSJzdHlsZSI6bD0ibGluayIsbz10Lm5vZGU9dGhpcy5fY3JlYXRlTm9kZShsLHQuYXR0cmlidXRlcyx0LmRvYykpLHM/KG8uc2V0QXR0cmlidXRlKCJzcmMiLHQudXJsKSx0LmFzeW5jP28uYXN5bmM9ITA6KG4uYXN5bmMmJihvLmFzeW5jPSExKSxuLnByZXNlcnZlc1NjcmlwdE9yZGVyfHwodGhpcy5fcGVuZGluZz10KSkpOiFuLmNzc0xvYWQmJmEuZ2Vja28/by5pbm5lckhUTUw9KHQuYXR0cmlidXRlcy5jaGFyc2V0PydAY2hhcnNldCAiJyt0LmF0dHJpYnV0ZXMuY2hhcnNldCsnIjsnOiIiKSsnQGltcG9ydCAiJyt0LnVybCsnIjsnOm8uc2V0QXR0cmlidXRlKCJocmVmIix0LnVybCkscyYmYS5pZSYmKGEuaWU8OXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlJiZkb2N1bWVudC5kb2N1bWVudE1vZGU8OSk/by5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXsvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KG8ucmVhZHlTdGF0ZSkmJihvLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGgoKSl9OiFzJiYhbi5jc3NMb2FkP3RoaXMuX3BvbGwodCk6KGEuaWU+PTEwPyhvLm9uZXJyb3I9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGMsMCl9LG8ub25sb2FkPWZ1bmN0aW9uKCl7c2V0VGltZW91dChoLDApfSk6KG8ub25lcnJvcj1jLG8ub25sb2FkPWgpLCFuLmNzc0ZhaWwmJiFzJiYoZj1zZXRUaW1lb3V0KGMsdC50aW1lb3V0fHwzZTMpKSksdGhpcy5ub2Rlcy5wdXNoKG8pLHIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobyxyKX0sX25leHQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9wZW5kaW5nKXJldHVybjt0aGlzLl9xdWV1ZS5sZW5ndGg/dGhpcy5faW5zZXJ0KHRoaXMuX3F1ZXVlLnNoaWZ0KCkpOnRoaXMuX3JlcXNXYWl0aW5nfHx0aGlzLl9maW5pc2goKX0sX3BvbGw6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPW4uX3BlbmRpbmdDU1MsaT1lLlVBLndlYmtpdCxzLG8sdSxhLGYsbDtpZih0KXtyfHwocj1uLl9wZW5kaW5nQ1NTPVtdKSxyLnB1c2godCk7aWYobi5fcG9sbFRpbWVyKXJldHVybn1uLl9wb2xsVGltZXI9bnVsbDtmb3Iocz0wO3M8ci5sZW5ndGg7KytzKXtmPXJbc107aWYoaSl7bD1mLmRvYy5zdHlsZVNoZWV0cyx1PWwubGVuZ3RoLGE9Zi5ub2RlLmhyZWY7d2hpbGUoLS11Pj0wKWlmKGxbdV0uaHJlZj09PWEpe3Iuc3BsaWNlKHMsMSkscy09MSxuLl9wcm9ncmVzcyhudWxsLGYpO2JyZWFrfX1lbHNlIHRyeXtvPSEhZi5ub2RlLnNoZWV0LmNzc1J1bGVzLHIuc3BsaWNlKHMsMSkscy09MSxuLl9wcm9ncmVzcyhudWxsLGYpfWNhdGNoKGMpe319ci5sZW5ndGgmJihuLl9wb2xsVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe24uX3BvbGwuY2FsbChuKX0sbi5vcHRpb25zLnBvbGxJbnRlcnZhbCkpfSxfcHJvZ3Jlc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm9wdGlvbnMKO2UmJih0LmVycm9yPWUsdGhpcy5lcnJvcnMucHVzaCh7ZXJyb3I6ZSxyZXF1ZXN0OnR9KSksdC5ub2RlLl95dWlnZXRfZmluaXNoZWQ9dC5maW5pc2hlZD0hMCxuLm9uUHJvZ3Jlc3MmJm4ub25Qcm9ncmVzcy5jYWxsKG4uY29udGV4dHx8dGhpcyx0aGlzLl9nZXRFdmVudERhdGEodCkpLHQuYXV0b3B1cmdlJiYoaS5fYXV0b1B1cmdlKHRoaXMub3B0aW9ucy5wdXJnZXRocmVzaG9sZCksaS5fcHVyZ2VOb2Rlcy5wdXNoKHQubm9kZSkpLHRoaXMuX3BlbmRpbmc9PT10JiYodGhpcy5fcGVuZGluZz1udWxsKSx0aGlzLl9yZXFzV2FpdGluZy09MSx0aGlzLl9uZXh0KCl9fX0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pLFlVSS5hZGQoImZlYXR1cmVzIixmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2UubWl4KGUubmFtZXNwYWNlKCJGZWF0dXJlcyIpLHt0ZXN0czpuLGFkZDpmdW5jdGlvbihlLHQscil7bltlXT1uW2VdfHx7fSxuW2VdW3RdPXJ9LGFsbDpmdW5jdGlvbih0LHIpe3ZhciBpPW5bdF0scz1bXTtyZXR1cm4gaSYmZS5PYmplY3QuZWFjaChpLGZ1bmN0aW9uKG4saSl7cy5wdXNoKGkrIjoiKyhlLkZlYXR1cmVzLnRlc3QodCxpLHIpPzE6MCkpfSkscy5sZW5ndGg/cy5qb2luKCI7Iik6IiJ9LHRlc3Q6ZnVuY3Rpb24odCxyLGkpe2k9aXx8W107dmFyIHMsbyx1LGE9blt0XSxmPWEmJmFbcl07cmV0dXJuIWZ8fChzPWYucmVzdWx0LGUuTGFuZy5pc1VuZGVmaW5lZChzKSYmKG89Zi51YSxvJiYocz1lLlVBW29dKSx1PWYudGVzdCx1JiYoIW98fHMpJiYocz11LmFwcGx5KGUsaSkpLGYucmVzdWx0PXMpKSxzfX0pO3ZhciByPWUuRmVhdHVyZXMuYWRkO3IoImxvYWQiLCIwIix7bmFtZToiYXBwLXRyYW5zaXRpb25zLW5hdGl2ZSIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10P3QuZG9jdW1lbnRFbGVtZW50Om51bGw7cmV0dXJuIG4mJm4uc3R5bGU/Ik1velRyYW5zaXRpb24iaW4gbi5zdHlsZXx8IldlYmtpdFRyYW5zaXRpb24iaW4gbi5zdHlsZXx8InRyYW5zaXRpb24iaW4gbi5zdHlsZTohMX0sdHJpZ2dlcjoiYXBwLXRyYW5zaXRpb25zIn0pLHIoImxvYWQiLCIxIix7bmFtZToiYXV0b2NvbXBsZXRlLWxpc3Qta2V5cyIsdGVzdDpmdW5jdGlvbihlKXtyZXR1cm4hZS5VQS5pb3MmJiFlLlVBLmFuZHJvaWR9LHRyaWdnZXI6ImF1dG9jb21wbGV0ZS1saXN0In0pLHIoImxvYWQiLCIyIix7bmFtZToiZGQtZ2VzdHVyZXMiLHRyaWdnZXI6ImRkLWRyYWciLHVhOiJ0b3VjaEVuYWJsZWQifSkscigibG9hZCIsIjMiLHtuYW1lOiJkb20tc3R5bGUtaWUiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5GZWF0dXJlcy50ZXN0LG49ZS5GZWF0dXJlcy5hZGQscj1lLmNvbmZpZy53aW4saT1lLmNvbmZpZy5kb2Mscz0iZG9jdW1lbnRFbGVtZW50IixvPSExO3JldHVybiBuKCJzdHlsZSIsImNvbXB1dGVkU3R5bGUiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHImJiJnZXRDb21wdXRlZFN0eWxlImluIHJ9fSksbigic3R5bGUiLCJvcGFjaXR5Iix7dGVzdDpmdW5jdGlvbigpe3JldHVybiBpJiYib3BhY2l0eSJpbiBpW3NdLnN0eWxlfX0pLG89IXQoInN0eWxlIiwib3BhY2l0eSIpJiYhdCgic3R5bGUiLCJjb21wdXRlZFN0eWxlIiksb30sdHJpZ2dlcjoiZG9tLXN0eWxlIn0pLHIoImxvYWQiLCI0Iix7bmFtZToiZWRpdG9yLXBhcmEtaWUiLHRyaWdnZXI6ImVkaXRvci1wYXJhIix1YToiaWUiLHdoZW46Imluc3RlYWQifSkscigibG9hZCIsIjUiLHtuYW1lOiJldmVudC1iYXNlLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmltcGxlbWVudGF0aW9uO3JldHVybiB0JiYhdC5oYXNGZWF0dXJlKCJFdmVudHMiLCIyLjAiKX0sdHJpZ2dlcjoibm9kZS1iYXNlIn0pLHIoImxvYWQiLCI2Iix7bmFtZToiZ3JhcGhpY3MtY2FudmFzIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lJiZlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZT09ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuKCFpfHxuKSYmciYmci5nZXRDb250ZXh0JiZyLmdldENvbnRleHQoIjJkIil9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCI3Iix7bmFtZToiZ3JhcGhpY3MtY2FudmFzLWRlZmF1bHQiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49ZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmUmJmUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lPT0iY2FudmFzIixyPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT10JiZ0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKTtyZXR1cm4oIWl8fG4pJiZyJiZyLmdldENvbnRleHQmJnIuZ2V0Q29udGV4dCgiMmQiKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSkscigibG9hZCIsIjgiLHtuYW1lOiJncmFwaGljcy1zdmciLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49IWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lfHxlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZSE9ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuIGkmJihufHwhcil9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCI5Iix7bmFtZToiZ3JhcGhpY3Mtc3ZnLWRlZmF1bHQiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49IWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lfHxlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZSE9ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuIGkmJihufHwhcil9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCIxMCIse25hbWU6ImdyYXBoaWNzLXZtbCIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3JldHVybiB0JiYhdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIikmJighbnx8IW4uZ2V0Q29udGV4dHx8IW4uZ2V0Q29udGV4dCgiMmQiKSl9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCIxMSIse25hbWU6ImdyYXBoaWNzLXZtbC1kZWZhdWx0Iix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJuIHQmJiF0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKSYmKCFufHwhbi5nZXRDb250ZXh0fHwhbi5nZXRDb250ZXh0KCIyZCIpKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSkscigibG9hZCIsIjEyIix7bmFtZToiaGlzdG9yeS1oYXNoLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmRvY3VtZW50TW9kZTtyZXR1cm4gZS5VQS5pZSYmKCEoIm9uaGFzaGNoYW5nZSJpbiBlLmNvbmZpZy53aW4pfHwhdHx8dDw4KX0sdHJpZ2dlcjoiaGlzdG9yeS1oYXNoIn0pLHIoImxvYWQiLCIxMyIse25hbWU6ImlvLW5vZGVqcyIsdHJpZ2dlcjoiaW8tYmFzZSIsdWE6Im5vZGVqcyJ9KSxyKCJsb2FkIiwiMTQiLHtuYW1lOiJqc29uLXBhcnNlLXNoaW0iLHRlc3Q6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gaShlLHQpe3JldHVybiBlPT09Im9rIj8hMDp0fXZhciB0PWUuY29uZmlnLmdsb2JhbC5KU09OLG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgSlNPTl0iJiZ0LHI9ZS5jb25maWcudXNlTmF0aXZlSlNPTlBhcnNlIT09ITEmJiEhbjtpZihyKXRyeXtyPW4ucGFyc2UoJ3sib2siOmZhbHNlfScsaSkub2t9Y2F0Y2gocyl7cj0hMX1yZXR1cm4hcn0sdHJpZ2dlcjoianNvbi1wYXJzZSJ9KSxyKCJsb2FkIiwiMTUiLHtuYW1lOiJqc29uLXN0cmluZ2lmeS1zaGltIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmdsb2JhbC5KU09OLG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgSlNPTl0iJiZ0LHI9ZS5jb25maWcudXNlTmF0aXZlSlNPTlN0cmluZ2lmeSE9PSExJiYhIW47aWYocil0cnl7cj0iMCI9PT1uLnN0cmluZ2lmeSgwKX1jYXRjaChpKXtyPSExfXJldHVybiFyfSx0cmlnZ2VyOiJqc29uLXN0cmluZ2lmeSJ9KSxyKCJsb2FkIiwiMTYiLHtuYW1lOiJzY3JvbGx2aWV3LWJhc2UtaWUiLHRyaWdnZXI6InNjcm9sbHZpZXctYmFzZSIsdWE6ImllIn0pLHIoImxvYWQiLCIxNyIse25hbWU6InNlbGVjdG9yLWNzczIiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49dCYmISgicXVlcnlTZWxlY3RvckFsbCJpbiB0KTtyZXR1cm4gbn0sdHJpZ2dlcjoic2VsZWN0b3IifSkscigibG9hZCIsIjE4Iix7bmFtZToidHJhbnNpdGlvbi10aW1lciIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10P3QuZG9jdW1lbnRFbGVtZW50Om51bGwscj0hMDtyZXR1cm4gbiYmbi5zdHlsZSYmKHI9ISgiTW96VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwiV2Via2l0VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwidHJhbnNpdGlvbiJpbiBuLnN0eWxlKSkscn0sdHJpZ2dlcjoidHJhbnNpdGlvbiJ9KSxyKCJsb2FkIiwiMTkiLHtuYW1lOiJ3aWRnZXQtYmFzZS1pZSIsdHJpZ2dlcjoid2lkZ2V0LWJhc2UiLHVhOiJpZSJ9KSxyKCJsb2FkIiwiMjAiLHtuYW1lOiJ5cWwtanNvbnAiLHRlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIWUuVUEubm9kZWpzJiYhZS5VQS53aW5qc30sdHJpZ2dlcjoieXFsIn0pLHIoImxvYWQiLCIyMSIse25hbWU6InlxbC1ub2RlanMiLHRyaWdnZXI6InlxbCIsdWE6Im5vZGVqcyJ9KSxyKCJsb2FkIiwiMjIiLHtuYW1lOiJ5cWwtd2luanMiLHRyaWdnZXI6InlxbCIsdWE6IndpbmpzIn0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSksWVVJLmFkZCgiaW50bC1iYXNlIixmdW5jdGlvbihlLHQpe3ZhciBuPS9bLCBdLztlLm1peChlLm5hbWVzcGFjZSgiSW50bCIpLHtsb29rdXBCZXN0TGFuZzpmdW5jdGlvbih0LHIpe2Z1bmN0aW9uIGEoZSl7dmFyIHQ7Zm9yKHQ9MDt0PHIubGVuZ3RoO3QrPTEpaWYoZS50b0xvd2VyQ2FzZSgpPT09clt0XS50b0xvd2VyQ2FzZSgpKXJldHVybiByW3RdfXZhciBpLHMsbyx1O2UuTGFuZy5pc1N0cmluZyh0KSYmKHQ9dC5zcGxpdChuKSk7Zm9yKGk9MDtpPHQubGVuZ3RoO2krPTEpe3M9dFtpXTtpZighc3x8cz09PSIqIiljb250aW51ZTt3aGlsZShzLmxlbmd0aD4wKXtvPWEocyk7aWYobylyZXR1cm4gbzt1PXMubGFzdEluZGV4T2YoIi0iKTtpZighKHU+PTApKWJyZWFrO3M9cy5zdWJzdHJpbmcoMCx1KSx1Pj0yJiZzLmNoYXJBdCh1LTIpPT09Ii0iJiYocz1zLnN1YnN0cmluZygwLHUtMikpfX1yZXR1cm4iIn19KX0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pLFlVSS5hZGQoInl1aS1sb2ciLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZSxyPSJ5dWk6bG9nIixpPSJ1bmRlZmluZWQiLHM9e2RlYnVnOjEsaW5mbzoyLHdhcm46NCxlcnJvcjo4fTtuLmxvZz1mdW5jdGlvbihlLHQsbyx1KXt2YXIgYSxmLGwsYyxoLHAsZD1uLHY9ZC5jb25maWcsbT1kLmZpcmU/ZDpZVUkuRW52Ci5nbG9iYWxFdmVudHM7cmV0dXJuIHYuZGVidWcmJihvPW98fCIiLHR5cGVvZiBvIT0idW5kZWZpbmVkIiYmKGY9di5sb2dFeGNsdWRlLGw9di5sb2dJbmNsdWRlLCFsfHxvIGluIGw/bCYmbyBpbiBsP2E9IWxbb106ZiYmbyBpbiBmJiYoYT1mW29dKTphPTEsdHlwZW9mIHQ9PSJ1bmRlZmluZWQiJiYodD0iaW5mbyIpLGQuY29uZmlnLmxvZ0xldmVsPWQuY29uZmlnLmxvZ0xldmVsfHwiZGVidWciLHA9c1tkLmNvbmZpZy5sb2dMZXZlbC50b0xvd2VyQ2FzZSgpXSx0IGluIHMmJnNbdF08cCYmKGE9MSkpLGF8fCh2LnVzZUJyb3dzZXJDb25zb2xlJiYoYz1vP28rIjogIitlOmUsZC5MYW5nLmlzRnVuY3Rpb24odi5sb2dGbik/di5sb2dGbi5jYWxsKGQsZSx0LG8pOnR5cGVvZiBjb25zb2xlIT09aSYmY29uc29sZS5sb2c/KGg9dCYmY29uc29sZVt0XSYmdCBpbiBzP3Q6ImxvZyIsY29uc29sZVtoXShjKSk6dHlwZW9mIG9wZXJhIT09aSYmb3BlcmEucG9zdEVycm9yKGMpKSxtJiYhdSYmKG09PT1kJiYhbS5nZXRFdmVudChyKSYmbS5wdWJsaXNoKHIse2Jyb2FkY2FzdDoyfSksbS5maXJlKHIse21zZzplLGNhdDp0LHNyYzpvfSkpKSksZH0sbi5tZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIG4ubG9nLmFwcGx5KG4sYXJndW1lbnRzKX19LCIzLjE3LjIiLHtyZXF1aXJlczpbInl1aS1iYXNlIl19KSxZVUkuYWRkKCJ5dWktbGF0ZXIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49W107ZS5sYXRlcj1mdW5jdGlvbih0LHIsaSxzLG8pe3Q9dHx8MCxzPWUuTGFuZy5pc1VuZGVmaW5lZChzKT9uOmUuQXJyYXkocykscj1yfHxlLmNvbmZpZy53aW58fGU7dmFyIHU9ITEsYT1yJiZlLkxhbmcuaXNTdHJpbmcoaSk/cltpXTppLGY9ZnVuY3Rpb24oKXt1fHwoYS5hcHBseT9hLmFwcGx5KHIsc3x8bik6YShzWzBdLHNbMV0sc1syXSxzWzNdKSl9LGw9bz9zZXRJbnRlcnZhbChmLHQpOnNldFRpbWVvdXQoZix0KTtyZXR1cm57aWQ6bCxpbnRlcnZhbDpvLGNhbmNlbDpmdW5jdGlvbigpe3U9ITAsdGhpcy5pbnRlcnZhbD9jbGVhckludGVydmFsKGwpOmNsZWFyVGltZW91dChsKX19fSxlLkxhbmcubGF0ZXI9ZS5sYXRlcn0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pLFlVSS5hZGQoImxvYWRlci1iYXNlIixmdW5jdGlvbihlLHQpeyhmdW5jdGlvbigpe3ZhciB0PWUudmVyc2lvbixuPSIvYnVpbGQvIixyPXQrIi8iLGk9ZS5FbnYuYmFzZSxzPSJnYWxsZXJ5LTIwMTQuMDUuMjktMTUtNDYiLG89IjJpbjMiLHU9IjQiLGE9IjIuOS4wIixmPWkrImNvbWJvPyIsbD17dmVyc2lvbjp0LHJvb3Q6cixiYXNlOmUuRW52LmJhc2UsY29tYm9CYXNlOmYsc2tpbjp7ZGVmYXVsdFNraW46InNhbSIsYmFzZToiYXNzZXRzL3NraW5zLyIscGF0aDoic2tpbi5jc3MiLGFmdGVyOlsiY3NzcmVzZXQiLCJjc3Nmb250cyIsImNzc2dyaWRzIiwiY3NzYmFzZSIsImNzc3Jlc2V0LWNvbnRleHQiLCJjc3Nmb250cy1jb250ZXh0Il19LGdyb3Vwczp7fSxwYXR0ZXJuczp7fX0sYz1sLmdyb3VwcyxoPWZ1bmN0aW9uKGUsdCxyKXt2YXIgcz1vKyIuIisoZXx8dSkrIi8iKyh0fHxhKStuLGw9ciYmci5iYXNlP3IuYmFzZTppLGg9ciYmci5jb21ib0Jhc2U/ci5jb21ib0Jhc2U6ZjtjLnl1aTIuYmFzZT1sK3MsYy55dWkyLnJvb3Q9cyxjLnl1aTIuY29tYm9CYXNlPWh9LHA9ZnVuY3Rpb24oZSx0KXt2YXIgcj0oZXx8cykrbixvPXQmJnQuYmFzZT90LmJhc2U6aSx1PXQmJnQuY29tYm9CYXNlP3QuY29tYm9CYXNlOmY7Yy5nYWxsZXJ5LmJhc2U9bytyLGMuZ2FsbGVyeS5yb290PXIsYy5nYWxsZXJ5LmNvbWJvQmFzZT11fTtjW3RdPXt9LGMuZ2FsbGVyeT17ZXh0OiExLGNvbWJpbmU6ITAsY29tYm9CYXNlOmYsdXBkYXRlOnAscGF0dGVybnM6eyJnYWxsZXJ5LSI6e30sImxhbmcvZ2FsbGVyeS0iOnt9LCJnYWxsZXJ5Y3NzLSI6e3R5cGU6ImNzcyJ9fX0sYy55dWkyPXtjb21iaW5lOiEwLGV4dDohMSxjb21ib0Jhc2U6Zix1cGRhdGU6aCxwYXR0ZXJuczp7Inl1aTItIjp7Y29uZmlnRm46ZnVuY3Rpb24oZSl7Ly1za2lufHJlc2V0fGZvbnRzfGdyaWRzfGJhc2UvLnRlc3QoZS5uYW1lKSYmKGUudHlwZT0iY3NzIixlLnBhdGg9ZS5wYXRoLnJlcGxhY2UoL1wuanMvLCIuY3NzIiksZS5wYXRoPWUucGF0aC5yZXBsYWNlKC9cL3l1aTItc2tpbi8sIi9hc3NldHMvc2tpbnMvc2FtL3l1aTItc2tpbiIpKX19fX0scCgpLGgoKSxZVUkuRW52W3RdJiZlLm1peChsLFlVSS5FbnZbdF0sITEsWyJtb2R1bGVzIiwiZ3JvdXBzIiwic2tpbiJdLDAsITApLFlVSS5FbnZbdF09bH0pKCk7dmFyIG49e30scj1bXSxpPTEwMjQscz1ZVUkuRW52LG89cy5fbG9hZGVkLHU9ImNzcyIsYT0ianMiLGY9ImludGwiLGw9InNhbSIsYz1lLnZlcnNpb24saD0iIixwPWUuT2JqZWN0LGQ9cC5lYWNoLHY9ZS5BcnJheSxtPXMuX2xvYWRlclF1ZXVlLGc9c1tjXSx5PSJza2luLSIsYj1lLkxhbmcsdz1zLm1vZHMsRSxTPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUrIi8iK3Q7cmV0dXJuIHJ8fChpKz0iLW1pbiIpLGkrPSIuIisobnx8dSksaX07WVVJLkVudi5fY3NzTG9hZGVkfHwoWVVJLkVudi5fY3NzTG9hZGVkPXt9KSxlLkVudi5tZXRhPWcsZS5Mb2FkZXI9ZnVuY3Rpb24odCl7dmFyIG49dGhpczt0PXR8fHt9LEU9Zy5tZDUsbi5jb250ZXh0PWUsdC5kb0JlZm9yZUxvYWRlciYmdC5kb0JlZm9yZUxvYWRlci5hcHBseShuLGFyZ3VtZW50cyksbi5iYXNlPWUuRW52Lm1ldGEuYmFzZStlLkVudi5tZXRhLnJvb3Qsbi5jb21ib0Jhc2U9ZS5FbnYubWV0YS5jb21ib0Jhc2Usbi5jb21iaW5lPXQuYmFzZSYmdC5iYXNlLmluZGV4T2Yobi5jb21ib0Jhc2Uuc3Vic3RyKDAsMjApKT4tMSxuLmNvbWJvU2VwPSImIixuLm1heFVSTExlbmd0aD1pLG4uaWdub3JlUmVnaXN0ZXJlZD10Lmlnbm9yZVJlZ2lzdGVyZWQsbi5yb290PWUuRW52Lm1ldGEucm9vdCxuLnRpbWVvdXQ9MCxuLmZvcmNlTWFwPXt9LG4uYWxsb3dSb2xsdXA9ITEsbi5maWx0ZXJzPXt9LG4ucmVxdWlyZWQ9e30sbi5wYXR0ZXJucz17fSxuLm1vZHVsZUluZm89e30sbi5ncm91cHM9ZS5tZXJnZShlLkVudi5tZXRhLmdyb3Vwcyksbi5za2luPWUubWVyZ2UoZS5FbnYubWV0YS5za2luKSxuLmNvbmRpdGlvbnM9e30sbi5jb25maWc9dCxuLl9pbnRlcm5hbD0hMCxuLl9wb3B1bGF0ZUNvbmRpdGlvbnNDYWNoZSgpLG4ubG9hZGVkPW9bY10sbi5hc3luYz0hMCxuLl9pbnNwZWN0UGFnZSgpLG4uX2ludGVybmFsPSExLG4uX2NvbmZpZyh0KSxuLmZvcmNlTWFwPW4uZm9yY2U/ZS5BcnJheS5oYXNoKG4uZm9yY2UpOnt9LG4udGVzdHJlc3VsdHM9bnVsbCxlLmNvbmZpZy50ZXN0cyYmKG4udGVzdHJlc3VsdHM9ZS5jb25maWcudGVzdHMpLG4uc29ydGVkPVtdLG4uZGlydHk9ITAsbi5pbnNlcnRlZD17fSxuLnNraXBwZWQ9e30sbi50ZXN0ZWQ9e30sbi5pZ25vcmVSZWdpc3RlcmVkJiZuLl9yZXNldE1vZHVsZXMoKX0sZS5Mb2FkZXIucHJvdG90eXBlPXtnZXRNb2R1bGVJbmZvOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMubW9kdWxlSW5mb1t0XSxyLGksbyxhO3JldHVybiBuP246KHI9Zy5tb2R1bGVzLGk9cy5fcmVuZGVyZWRNb2RzLG89dGhpcy5faW50ZXJuYWwsaSYmaS5oYXNPd25Qcm9wZXJ0eSh0KSYmIXRoaXMuaWdub3JlUmVnaXN0ZXJlZD90aGlzLm1vZHVsZUluZm9bdF09ZS5tZXJnZShpW3RdKTpyLmhhc093blByb3BlcnR5KHQpJiYodGhpcy5faW50ZXJuYWw9ITAsYT10aGlzLmFkZE1vZHVsZShyW3RdLHQpLGEmJmEudHlwZT09PXUmJnRoaXMuaXNDU1NMb2FkZWQoYS5uYW1lLCEwKSYmKHRoaXMubG9hZGVkW2EubmFtZV09ITApLHRoaXMuX2ludGVybmFsPW8pLHRoaXMubW9kdWxlSW5mb1t0XSl9LF9leHBhbmRBbGlhc2VzOmZ1bmN0aW9uKHQpe3ZhciBuPVtdLHI9WVVJLkVudi5hbGlhc2VzLGksczt0PWUuQXJyYXkodCk7Zm9yKGk9MDtpPHQubGVuZ3RoO2krPTEpcz10W2ldLG4ucHVzaC5hcHBseShuLHJbc10/cltzXTpbc10pO3JldHVybiBufSxfcG9wdWxhdGVDb25kaXRpb25zQ2FjaGU6ZnVuY3Rpb24oKXt2YXIgdD1nLm1vZHVsZXMsbj1zLl9jb25kaXRpb25zLHIsaSxvLHU7aWYobiYmIXRoaXMuaWdub3JlUmVnaXN0ZXJlZClmb3IociBpbiBuKW4uaGFzT3duUHJvcGVydHkocikmJih0aGlzLmNvbmRpdGlvbnNbcl09ZS5tZXJnZShuW3JdKSk7ZWxzZXtmb3IociBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocikmJnRbcl0uY29uZGl0aW9uKXtvPXRoaXMuX2V4cGFuZEFsaWFzZXModFtyXS5jb25kaXRpb24udHJpZ2dlcik7Zm9yKGk9MDtpPG8ubGVuZ3RoO2krPTEpdT1vW2ldLHRoaXMuY29uZGl0aW9uc1t1XT10aGlzLmNvbmRpdGlvbnNbdV18fHt9LHRoaXMuY29uZGl0aW9uc1t1XVt0W3JdLm5hbWV8fHJdPXRbcl0uY29uZGl0aW9ufXMuX2NvbmRpdGlvbnM9dGhpcy5jb25kaXRpb25zfX0sX3Jlc2V0TW9kdWxlczpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdCxuLHIsaSxzO2Zvcih0IGluIGUubW9kdWxlSW5mbylpZihlLm1vZHVsZUluZm8uaGFzT3duUHJvcGVydHkodCkmJmUubW9kdWxlSW5mb1t0XSl7cj1lLm1vZHVsZUluZm9bdF0saT1yLm5hbWUscz1ZVUkuRW52Lm1vZHNbaV0/WVVJLkVudi5tb2RzW2ldLmRldGFpbHM6bnVsbCxzJiYoZS5tb2R1bGVJbmZvW2ldLl9yZXNldD0hMCxlLm1vZHVsZUluZm9baV0ucmVxdWlyZXM9cy5yZXF1aXJlc3x8W10sZS5tb2R1bGVJbmZvW2ldLm9wdGlvbmFsPXMub3B0aW9uYWx8fFtdLGUubW9kdWxlSW5mb1tpXS5zdXBlcnNlZGVzPXMuc3VwZXJjZWRlc3x8W10pO2lmKHIuZGVmYXVsdHMpZm9yKG4gaW4gci5kZWZhdWx0cylyLmRlZmF1bHRzLmhhc093blByb3BlcnR5KG4pJiZyW25dJiYocltuXT1yLmRlZmF1bHRzW25dKTtyLmxhbmdDYWNoZT11bmRlZmluZWQsci5za2luQ2FjaGU9dW5kZWZpbmVkLHIuc2tpbm5hYmxlJiZlLl9hZGRTa2luKGUuc2tpbi5kZWZhdWx0U2tpbixyLm5hbWUpfX0sUkVHRVhfQ1NTOi9cLmNzcyg/Ols/O10uKik/JC9pLEZJTFRFUl9ERUZTOntSQVc6e3NlYXJjaEV4cDoiLW1pblxcLmpzIixyZXBsYWNlU3RyOiIuanMifSxERUJVRzp7c2VhcmNoRXhwOiItbWluXFwuanMiLHJlcGxhY2VTdHI6Ii1kZWJ1Zy5qcyJ9LENPVkVSQUdFOntzZWFyY2hFeHA6Ii1taW5cXC5qcyIscmVwbGFjZVN0cjoiLWNvdmVyYWdlLmpzIn19LF9pbnNwZWN0UGFnZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdCxuLHIsaSxzO2ZvcihzIGluIHcpdy5oYXNPd25Qcm9wZXJ0eShzKSYmKHQ9d1tzXSx0LmRldGFpbHMmJihuPWUuZ2V0TW9kdWxlSW5mbyh0Lm5hbWUpLHI9dC5kZXRhaWxzLnJlcXVpcmVzLGk9biYmbi5yZXF1aXJlcyxuPyFuLl9pbnNwZWN0ZWQmJnImJmkubGVuZ3RoIT09ci5sZW5ndGgmJmRlbGV0ZSBuLmV4cGFuZGVkOm49ZS5hZGRNb2R1bGUodC5kZXRhaWxzLHMpLG4uX2luc3BlY3RlZD0hMCkpfSxfcmVxdWlyZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvPXRoaXMuZ2V0TW9kdWxlSW5mbyhlKSxhPXRoaXMuZ2V0TW9kdWxlSW5mbyh0KTtpZighb3x8IWEpcmV0dXJuITE7cj1vLmV4cGFuZGVkX21hcCxpPW8uYWZ0ZXJfbWFwO2lmKGkmJnQgaW4gaSlyZXR1cm4hMDtpPWEuYWZ0ZXJfbWFwO2lmKGkmJmUgaW4gaSlyZXR1cm4hMTtzPWEuc3VwZXJzZWRlcztpZihzKWZvcihuPTA7bjxzLmxlbmd0aDtuKyspaWYodGhpcy5fcmVxdWlyZXMoZSxzW25dKSlyZXR1cm4hMDtzPW8uc3VwZXJzZWRlcztpZihzKWZvcihuPTA7bjxzLmxlbmd0aDtuKyspaWYodGhpcy5fcmVxdWlyZXModCxzW25dKSlyZXR1cm4hMTtyZXR1cm4gciYmdCBpbiByPyEwOm8uZXh0JiZvLnR5cGU9PT11JiYhYS5leHQmJmEudHlwZT09PXU/ITA6ITF9LF9jb25maWc6ZnVuY3Rpb24odCl7dmFyIG4scixpLHMsbyx1LGEsZj10aGlzLGw9W10sYyxoO2lmKHQpZm9yKG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pKXtpPXRbbl07aWYobj09PSJyZXF1aXJlIilmLnJlcXVpcmUoaSk7ZWxzZSBpZihuPT09InNraW4iKXR5cGVvZiBpPT0ic3RyaW5nIiYmKGYuc2tpbi5kZWZhdWx0U2tpbj0KdC5za2luLGk9e2RlZmF1bHRTa2luOml9KSxlLm1peChmLnNraW4saSwhMCk7ZWxzZSBpZihuPT09Imdyb3VwcyIpe2ZvcihyIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShyKSl7YT1yLHU9aVtyXSxmLmFkZEdyb3VwKHUsYSk7aWYodS5hbGlhc2VzKWZvcihzIGluIHUuYWxpYXNlcyl1LmFsaWFzZXMuaGFzT3duUHJvcGVydHkocykmJmYuYWRkQWxpYXModS5hbGlhc2VzW3NdLHMpfX1lbHNlIGlmKG49PT0ibW9kdWxlcyIpZm9yKHIgaW4gaSlpLmhhc093blByb3BlcnR5KHIpJiZmLmFkZE1vZHVsZShpW3JdLHIpO2Vsc2UgaWYobj09PSJhbGlhc2VzIilmb3IociBpbiBpKWkuaGFzT3duUHJvcGVydHkocikmJmYuYWRkQWxpYXMoaVtyXSxyKTtlbHNlIG49PT0iZ2FsbGVyeSI/dGhpcy5ncm91cHMuZ2FsbGVyeS51cGRhdGUmJnRoaXMuZ3JvdXBzLmdhbGxlcnkudXBkYXRlKGksdCk6bj09PSJ5dWkyInx8bj09PSIyaW4zIj90aGlzLmdyb3Vwcy55dWkyLnVwZGF0ZSYmdGhpcy5ncm91cHMueXVpMi51cGRhdGUodFsiMmluMyJdLHQueXVpMix0KTpmW25dPWl9bz1mLmZpbHRlcixiLmlzU3RyaW5nKG8pJiYobz1vLnRvVXBwZXJDYXNlKCksZi5maWx0ZXJOYW1lPW8sZi5maWx0ZXI9Zi5GSUxURVJfREVGU1tvXSxvPT09IkRFQlVHIiYmZi5yZXF1aXJlKCJ5dWktbG9nIiwiZHVtcCIpKTtpZihmLmZpbHRlck5hbWUmJmYuY292ZXJhZ2UmJmYuZmlsdGVyTmFtZT09PSJDT1ZFUkFHRSImJmIuaXNBcnJheShmLmNvdmVyYWdlKSYmZi5jb3ZlcmFnZS5sZW5ndGgpe2ZvcihuPTA7bjxmLmNvdmVyYWdlLmxlbmd0aDtuKyspYz1mLmNvdmVyYWdlW25dLGg9Zi5nZXRNb2R1bGVJbmZvKGMpLGgmJmgudXNlP2w9bC5jb25jYXQoaC51c2UpOmwucHVzaChjKTtmLmZpbHRlcnM9Zi5maWx0ZXJzfHx7fSxlLkFycmF5LmVhY2gobCxmdW5jdGlvbihlKXtmLmZpbHRlcnNbZV09Zi5GSUxURVJfREVGUy5DT1ZFUkFHRX0pLGYuZmlsdGVyTmFtZT0iUkFXIixmLmZpbHRlcj1mLkZJTFRFUl9ERUZTW2YuZmlsdGVyTmFtZV19fSxmb3JtYXRTa2luOmZ1bmN0aW9uKGUsdCl7dmFyIG49eStlO3JldHVybiB0JiYobj1uKyItIit0KSxufSxfYWRkU2tpbjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxzLG89dGhpcy5za2luLHU9dCYmdGhpcy5nZXRNb2R1bGVJbmZvKHQpLGE9dSYmdS5leHQ7cmV0dXJuIHQmJihpPXRoaXMuZm9ybWF0U2tpbihlLHQpLHRoaXMuZ2V0TW9kdWxlSW5mbyhpKXx8KHI9dS5wa2d8fHQscz17c2tpbjohMCxuYW1lOmksZ3JvdXA6dS5ncm91cCx0eXBlOiJjc3MiLGFmdGVyOm8uYWZ0ZXIscGF0aDoobnx8cikrIi8iK28uYmFzZStlKyIvIit0KyIuY3NzIixleHQ6YX0sdS5iYXNlJiYocy5iYXNlPXUuYmFzZSksdS5jb25maWdGbiYmKHMuY29uZmlnRm49dS5jb25maWdGbiksdGhpcy5hZGRNb2R1bGUocyxpKSkpLGl9LGFkZEFsaWFzOmZ1bmN0aW9uKGUsdCl7WVVJLkVudi5hbGlhc2VzW3RdPWUsdGhpcy5hZGRNb2R1bGUoe25hbWU6dCx1c2U6ZX0pfSxhZGRHcm91cDpmdW5jdGlvbihlLHQpe3ZhciBuPWUubW9kdWxlcyxyPXRoaXMsaSxzO3Q9dHx8ZS5uYW1lLGUubmFtZT10LHIuZ3JvdXBzW3RdPWU7aWYoZS5wYXR0ZXJucylmb3IoaSBpbiBlLnBhdHRlcm5zKWUucGF0dGVybnMuaGFzT3duUHJvcGVydHkoaSkmJihlLnBhdHRlcm5zW2ldLmdyb3VwPXQsci5wYXR0ZXJuc1tpXT1lLnBhdHRlcm5zW2ldKTtpZihuKWZvcihpIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShpKSYmKHM9bltpXSx0eXBlb2Ygcz09InN0cmluZyImJihzPXtuYW1lOmksZnVsbHBhdGg6c30pLHMuZ3JvdXA9dCxyLmFkZE1vZHVsZShzLGkpKX0sYWRkTW9kdWxlOmZ1bmN0aW9uKHQsbil7bj1ufHx0Lm5hbWUsdHlwZW9mIHQ9PSJzdHJpbmciJiYodD17bmFtZTpuLGZ1bGxwYXRoOnR9KTt2YXIgcixpLG8sZixsLGMscCxkLG0sZyx5LGIsdyxFLHgsVCxOLEMsayxMLEEsTyxNPXRoaXMubW9kdWxlSW5mb1tuXSxfPXRoaXMuY29uZGl0aW9ucyxEO00mJk0udGVtcCYmKHQ9ZS5tZXJnZShNLHQpKSx0Lm5hbWU9bjtpZighdHx8IXQubmFtZSlyZXR1cm4gbnVsbDt0LnR5cGV8fCh0LnR5cGU9YSxPPXQucGF0aHx8dC5mdWxscGF0aCxPJiZ0aGlzLlJFR0VYX0NTUy50ZXN0KE8pJiYodC50eXBlPXUpKSwhdC5wYXRoJiYhdC5mdWxscGF0aCYmKHQucGF0aD1TKG4sbix0LnR5cGUpKSx0LnN1cGVyc2VkZXM9dC5zdXBlcnNlZGVzfHx0LnVzZSx0LmV4dD0iZXh0ImluIHQ/dC5leHQ6dGhpcy5faW50ZXJuYWw/ITE6ITAscj10LnN1Ym1vZHVsZXMsdGhpcy5tb2R1bGVJbmZvW25dPXQsdC5yZXF1aXJlcz10LnJlcXVpcmVzfHxbXTtpZih0aGlzLnJlcXVpcmVzKWZvcihpPTA7aTx0aGlzLnJlcXVpcmVzLmxlbmd0aDtpKyspdC5yZXF1aXJlcy5wdXNoKHRoaXMucmVxdWlyZXNbaV0pO2lmKHQuZ3JvdXAmJnRoaXMuZ3JvdXBzJiZ0aGlzLmdyb3Vwc1t0Lmdyb3VwXSl7QT10aGlzLmdyb3Vwc1t0Lmdyb3VwXTtpZihBLnJlcXVpcmVzKWZvcihpPTA7aTxBLnJlcXVpcmVzLmxlbmd0aDtpKyspdC5yZXF1aXJlcy5wdXNoKEEucmVxdWlyZXNbaV0pfXQuZGVmYXVsdHN8fCh0LmRlZmF1bHRzPXtyZXF1aXJlczp0LnJlcXVpcmVzP1tdLmNvbmNhdCh0LnJlcXVpcmVzKTpudWxsLHN1cGVyc2VkZXM6dC5zdXBlcnNlZGVzP1tdLmNvbmNhdCh0LnN1cGVyc2VkZXMpOm51bGwsb3B0aW9uYWw6dC5vcHRpb25hbD9bXS5jb25jYXQodC5vcHRpb25hbCk6bnVsbH0pLHQuc2tpbm5hYmxlJiZ0LmV4dCYmdC50ZW1wJiYoaz10aGlzLl9hZGRTa2luKHRoaXMuc2tpbi5kZWZhdWx0U2tpbixuKSx0LnJlcXVpcmVzLnVuc2hpZnQoaykpLHQucmVxdWlyZXMubGVuZ3RoJiYodC5yZXF1aXJlcz10aGlzLmZpbHRlclJlcXVpcmVzKHQucmVxdWlyZXMpfHxbXSk7aWYoIXQubGFuZ1BhY2smJnQubGFuZyl7eT12KHQubGFuZyk7Zm9yKGc9MDtnPHkubGVuZ3RoO2crKylUPXlbZ10sYj10aGlzLmdldExhbmdQYWNrTmFtZShULG4pLHA9dGhpcy5nZXRNb2R1bGVJbmZvKGIpLHB8fChwPXRoaXMuX2FkZExhbmdQYWNrKFQsdCxiKSl9aWYocil7bD10LnN1cGVyc2VkZXN8fFtdLG89MDtmb3IoaSBpbiByKWlmKHIuaGFzT3duUHJvcGVydHkoaSkpe2M9cltpXSxjLnBhdGg9Yy5wYXRofHxTKG4saSx0LnR5cGUpLGMucGtnPW4sYy5ncm91cD10Lmdyb3VwLGMuc3VwZXJzZWRlcyYmKGw9bC5jb25jYXQoYy5zdXBlcnNlZGVzKSkscD10aGlzLmFkZE1vZHVsZShjLGkpLGwucHVzaChpKTtpZihwLnNraW5uYWJsZSl7dC5za2lubmFibGU9ITAsQz10aGlzLnNraW4ub3ZlcnJpZGVzO2lmKEMmJkNbaV0pZm9yKGc9MDtnPENbaV0ubGVuZ3RoO2crKylrPXRoaXMuX2FkZFNraW4oQ1tpXVtnXSxpLG4pLGwucHVzaChrKTtrPXRoaXMuX2FkZFNraW4odGhpcy5za2luLmRlZmF1bHRTa2luLGksbiksbC5wdXNoKGspfWlmKGMubGFuZyYmYy5sYW5nLmxlbmd0aCl7eT12KGMubGFuZyk7Zm9yKGc9MDtnPHkubGVuZ3RoO2crKylUPXlbZ10sYj10aGlzLmdldExhbmdQYWNrTmFtZShULG4pLHc9dGhpcy5nZXRMYW5nUGFja05hbWUoVCxpKSxwPXRoaXMuZ2V0TW9kdWxlSW5mbyhiKSxwfHwocD10aGlzLl9hZGRMYW5nUGFjayhULHQsYikpLEU9RXx8di5oYXNoKHAuc3VwZXJzZWRlcyksdyBpbiBFfHxwLnN1cGVyc2VkZXMucHVzaCh3KSx0Lmxhbmc9dC5sYW5nfHxbXSx4PXh8fHYuaGFzaCh0LmxhbmcpLFQgaW4geHx8dC5sYW5nLnB1c2goVCksYj10aGlzLmdldExhbmdQYWNrTmFtZShoLG4pLHc9dGhpcy5nZXRMYW5nUGFja05hbWUoaCxpKSxwPXRoaXMuZ2V0TW9kdWxlSW5mbyhiKSxwfHwocD10aGlzLl9hZGRMYW5nUGFjayhULHQsYikpLHcgaW4gRXx8cC5zdXBlcnNlZGVzLnB1c2godyl9bysrfXQuc3VwZXJzZWRlcz12LmRlZHVwZShsKSx0aGlzLmFsbG93Um9sbHVwJiYodC5yb2xsdXA9bzw0P286TWF0aC5taW4oby0xLDQpKX1kPXQucGx1Z2lucztpZihkKWZvcihpIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShpKSYmKG09ZFtpXSxtLnBrZz1uLG0ucGF0aD1tLnBhdGh8fFMobixpLHQudHlwZSksbS5yZXF1aXJlcz1tLnJlcXVpcmVzfHxbXSxtLmdyb3VwPXQuZ3JvdXAsdGhpcy5hZGRNb2R1bGUobSxpKSx0LnNraW5uYWJsZSYmdGhpcy5fYWRkU2tpbih0aGlzLnNraW4uZGVmYXVsdFNraW4saSxuKSk7aWYodC5jb25kaXRpb24pe2Y9dGhpcy5fZXhwYW5kQWxpYXNlcyh0LmNvbmRpdGlvbi50cmlnZ2VyKTtmb3IoaT0wO2k8Zi5sZW5ndGg7aSsrKUQ9ZltpXSxMPXQuY29uZGl0aW9uLndoZW4sX1tEXT1fW0RdfHx7fSxfW0RdW25dPXQuY29uZGl0aW9uLEwmJkwhPT0iYWZ0ZXIiP0w9PT0iaW5zdGVhZCImJih0LnN1cGVyc2VkZXM9dC5zdXBlcnNlZGVzfHxbXSx0LnN1cGVyc2VkZXMucHVzaChEKSk6KHQuYWZ0ZXI9dC5hZnRlcnx8W10sdC5hZnRlci5wdXNoKEQpKX1yZXR1cm4gdC5zdXBlcnNlZGVzJiYodC5zdXBlcnNlZGVzPXRoaXMuZmlsdGVyUmVxdWlyZXModC5zdXBlcnNlZGVzKSksdC5hZnRlciYmKHQuYWZ0ZXI9dGhpcy5maWx0ZXJSZXF1aXJlcyh0LmFmdGVyKSx0LmFmdGVyX21hcD12Lmhhc2godC5hZnRlcikpLHQuY29uZmlnRm4mJihOPXQuY29uZmlnRm4odCksTj09PSExJiYoZGVsZXRlIHRoaXMubW9kdWxlSW5mb1tuXSxkZWxldGUgcy5fcmVuZGVyZWRNb2RzW25dLHQ9bnVsbCkpLHQmJihzLl9yZW5kZXJlZE1vZHN8fChzLl9yZW5kZXJlZE1vZHM9e30pLHMuX3JlbmRlcmVkTW9kc1tuXT1lLm1peChzLl9yZW5kZXJlZE1vZHNbbl18fHt9LHQpLHMuX2NvbmRpdGlvbnM9XyksdH0scmVxdWlyZTpmdW5jdGlvbih0KXt2YXIgbj10eXBlb2YgdD09InN0cmluZyI/dihhcmd1bWVudHMpOnQ7dGhpcy5kaXJ0eT0hMCx0aGlzLnJlcXVpcmVkPWUubWVyZ2UodGhpcy5yZXF1aXJlZCx2Lmhhc2godGhpcy5maWx0ZXJSZXF1aXJlcyhuKSkpLHRoaXMuX2V4cGxvZGVSb2xsdXBzKCl9LF9leHBsb2RlUm9sbHVwczpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdCxuLHIsaSxzLG8sdSxhPWUucmVxdWlyZWQ7aWYoIWUuYWxsb3dSb2xsdXApe2ZvcihyIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShyKSl7dD1lLmdldE1vZHVsZShyKTtpZih0JiZ0LnVzZSl7bz10LnVzZS5sZW5ndGg7Zm9yKGk9MDtpPG87aSsrKXtuPWUuZ2V0TW9kdWxlKHQudXNlW2ldKTtpZihuJiZuLnVzZSl7dT1uLnVzZS5sZW5ndGg7Zm9yKHM9MDtzPHU7cysrKWFbbi51c2Vbc11dPSEwfWVsc2UgYVt0LnVzZVtpXV09ITB9fX1lLnJlcXVpcmVkPWF9fSxmaWx0ZXJSZXF1aXJlczpmdW5jdGlvbih0KXtpZih0KXtlLkxhbmcuaXNBcnJheSh0KXx8KHQ9W3RdKSx0PWUuQXJyYXkodCk7dmFyIG49W10scixpLHMsbztmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXtpPXRoaXMuZ2V0TW9kdWxlKHRbcl0pO2lmKGkmJmkudXNlKWZvcihzPTA7czxpLnVzZS5sZW5ndGg7cysrKW89dGhpcy5nZXRNb2R1bGUoaS51c2Vbc10pLG8mJm8udXNlJiZvLm5hbWUhPT1pLm5hbWU/bj1lLkFycmF5LmRlZHVwZShbXS5jb25jYXQobix0aGlzLmZpbHRlclJlcXVpcmVzKG8udXNlKSkpOm4ucHVzaChpLnVzZVtzXSk7ZWxzZSBuLnB1c2godFtyXSl9dD1ufXJldHVybiB0fSxfY2FuQmVBdHRhY2hlZDpmdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLmdldE1vZHVsZSh0KSx0JiZ0LnRlc3Q/KHQuaGFzT3duUHJvcGVydHkoIl90ZXN0UmVzdWx0Iil8fCh0Ll90ZXN0UmVzdWx0PXQudGVzdChlKSksdC5fdGVzdFJlc3VsdCk6ITB9LGdldFJlcXVpcmVzOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiByO2lmKHQuX3BhcnNlZClyZXR1cm4gdC5leHBhbmRlZHx8cjt2YXIgbixpLHMsbyx1LGEsbCxjPXRoaXMudGVzdHJlc3VsdHMsbT10Lm5hbWUsZyx5PXdbbV0mJndbbV0uZGV0YWlscyxiPXQub3B0aW9uYWxSZXF1aXJlcyxFLFMseCxULE4sQyxrLEwsQSxPLE09dC5sYW5nfHx0LmludGwsXz1lLkZlYXR1cmVzJiZlLkZlYXR1cmVzLnRlc3RzLmxvYWQsRCxQO3QudGVtcCYmeSYmKE49dCx0PXRoaXMuYWRkTW9kdWxlKHksbSksdC5ncm91cD1OLmdyb3VwLHQucGtnPQpOLnBrZyxkZWxldGUgdC5leHBhbmRlZCksUD0hIXRoaXMubGFuZyYmdC5sYW5nQ2FjaGUhPT10aGlzLmxhbmd8fHQuc2tpbkNhY2hlIT09dGhpcy5za2luLmRlZmF1bHRTa2luO2lmKHQuZXhwYW5kZWQmJiFQKXJldHVybiB0LmV4cGFuZGVkO2lmKGIpZm9yKG49MCxvPWIubGVuZ3RoO248bztuKyspdGhpcy5fY2FuQmVBdHRhY2hlZChiW25dKSYmdC5yZXF1aXJlcy5wdXNoKGJbbl0pO0U9W10sRD17fSxUPXRoaXMuZmlsdGVyUmVxdWlyZXModC5yZXF1aXJlcyksdC5sYW5nJiYoRS51bnNoaWZ0KCJpbnRsIiksVC51bnNoaWZ0KCJpbnRsIiksTT0hMCksQz10aGlzLmZpbHRlclJlcXVpcmVzKHQub3B0aW9uYWwpLHQuX3BhcnNlZD0hMCx0LmxhbmdDYWNoZT10aGlzLmxhbmcsdC5za2luQ2FjaGU9dGhpcy5za2luLmRlZmF1bHRTa2luO2ZvcihuPTA7bjxULmxlbmd0aDtuKyspaWYoIURbVFtuXV0pe0UucHVzaChUW25dKSxEW1Rbbl1dPSEwLGk9dGhpcy5nZXRNb2R1bGUoVFtuXSk7aWYoaSl7dT10aGlzLmdldFJlcXVpcmVzKGkpLE09TXx8aS5leHBhbmRlZF9tYXAmJmYgaW4gaS5leHBhbmRlZF9tYXA7Zm9yKHM9MDtzPHUubGVuZ3RoO3MrKylFLnB1c2godVtzXSl9fVQ9dGhpcy5maWx0ZXJSZXF1aXJlcyh0LnN1cGVyc2VkZXMpO2lmKFQpZm9yKG49MDtuPFQubGVuZ3RoO24rKylpZighRFtUW25dXSl7dC5zdWJtb2R1bGVzJiZFLnB1c2goVFtuXSksRFtUW25dXT0hMCxpPXRoaXMuZ2V0TW9kdWxlKFRbbl0pO2lmKGkpe3U9dGhpcy5nZXRSZXF1aXJlcyhpKSxNPU18fGkuZXhwYW5kZWRfbWFwJiZmIGluIGkuZXhwYW5kZWRfbWFwO2ZvcihzPTA7czx1Lmxlbmd0aDtzKyspRS5wdXNoKHVbc10pfX1pZihDJiZ0aGlzLmxvYWRPcHRpb25hbClmb3Iobj0wO248Qy5sZW5ndGg7bisrKWlmKCFEW0Nbbl1dKXtFLnB1c2goQ1tuXSksRFtDW25dXT0hMCxpPXRoaXMuZ2V0TW9kdWxlSW5mbyhDW25dKTtpZihpKXt1PXRoaXMuZ2V0UmVxdWlyZXMoaSksTT1NfHxpLmV4cGFuZGVkX21hcCYmZiBpbiBpLmV4cGFuZGVkX21hcDtmb3Iocz0wO3M8dS5sZW5ndGg7cysrKUUucHVzaCh1W3NdKX19Zz10aGlzLmNvbmRpdGlvbnNbbV07aWYoZyl7dC5fcGFyc2VkPSExO2lmKGMmJl8pZChjLGZ1bmN0aW9uKGUsdCl7dmFyIG49X1t0XS5uYW1lOyFEW25dJiZfW3RdLnRyaWdnZXI9PT1tJiZlJiZfW3RdJiYoRFtuXT0hMCxFLnB1c2gobikpfSk7ZWxzZSBmb3IobiBpbiBnKWlmKGcuaGFzT3duUHJvcGVydHkobikmJiFEW25dKXt4PWdbbl0sUz14JiYoIXgudWEmJiF4LnRlc3R8fHgudWEmJmUuVUFbeC51YV18fHgudGVzdCYmeC50ZXN0KGUsVCkpO2lmKFMpe0Rbbl09ITAsRS5wdXNoKG4pLGk9dGhpcy5nZXRNb2R1bGUobik7aWYoaSl7dT10aGlzLmdldFJlcXVpcmVzKGkpO2ZvcihzPTA7czx1Lmxlbmd0aDtzKyspRS5wdXNoKHVbc10pfX19fWlmKHQuc2tpbm5hYmxlKXtMPXRoaXMuc2tpbi5vdmVycmlkZXM7Zm9yKG4gaW4gWVVJLkVudi5hbGlhc2VzKVlVSS5FbnYuYWxpYXNlcy5oYXNPd25Qcm9wZXJ0eShuKSYmZS5BcnJheS5pbmRleE9mKFlVSS5FbnYuYWxpYXNlc1tuXSxtKT4tMSYmKEE9bik7aWYoTCYmKExbbV18fEEmJkxbQV0pKXtPPW0sTFtBXSYmKE89QSk7Zm9yKG49MDtuPExbT10ubGVuZ3RoO24rKylrPXRoaXMuX2FkZFNraW4oTFtPXVtuXSxtKSx0aGlzLmlzQ1NTTG9hZGVkKGssdGhpcy5fYm9vdCl8fEUucHVzaChrKX1lbHNlIGs9dGhpcy5fYWRkU2tpbih0aGlzLnNraW4uZGVmYXVsdFNraW4sbSksdGhpcy5pc0NTU0xvYWRlZChrLHRoaXMuX2Jvb3QpfHxFLnB1c2goayl9cmV0dXJuIHQuX3BhcnNlZD0hMSxNJiYodC5sYW5nJiYhdC5sYW5nUGFjayYmZS5JbnRsJiYobD1lLkludGwubG9va3VwQmVzdExhbmcodGhpcy5sYW5nfHxoLHQubGFuZyksYT10aGlzLmdldExhbmdQYWNrTmFtZShsLG0pLGEmJkUudW5zaGlmdChhKSksRS51bnNoaWZ0KGYpKSx0LmV4cGFuZGVkX21hcD12Lmhhc2goRSksdC5leHBhbmRlZD1wLmtleXModC5leHBhbmRlZF9tYXApLHQuZXhwYW5kZWR9LGlzQ1NTTG9hZGVkOmZ1bmN0aW9uKHQsbil7aWYoIXR8fCFZVUkuRW52LmNzc1N0YW1wRWx8fCFuJiZ0aGlzLmlnbm9yZVJlZ2lzdGVyZWQpcmV0dXJuITE7dmFyIHI9WVVJLkVudi5jc3NTdGFtcEVsLGk9ITEscz1ZVUkuRW52Ll9jc3NMb2FkZWRbdF0sbz1yLmN1cnJlbnRTdHlsZTtyZXR1cm4gcyE9PXVuZGVmaW5lZD9zOihyLmNsYXNzTmFtZT10LG98fChvPWUuY29uZmlnLmRvYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCkpLG8mJm8uZGlzcGxheT09PSJub25lIiYmKGk9ITApLHIuY2xhc3NOYW1lPSIiLFlVSS5FbnYuX2Nzc0xvYWRlZFt0XT1pLGkpfSxnZXRQcm92aWRlczpmdW5jdGlvbih0KXt2YXIgcj10aGlzLmdldE1vZHVsZSh0KSxpLHM7cmV0dXJuIHI/KHImJiFyLnByb3ZpZGVzJiYoaT17fSxzPXIuc3VwZXJzZWRlcyxzJiZ2LmVhY2gocyxmdW5jdGlvbih0KXtlLm1peChpLHRoaXMuZ2V0UHJvdmlkZXModCkpfSx0aGlzKSxpW3RdPSEwLHIucHJvdmlkZXM9aSksci5wcm92aWRlcyk6bn0sY2FsY3VsYXRlOmZ1bmN0aW9uKGUsdCl7aWYoZXx8dHx8dGhpcy5kaXJ0eSllJiZ0aGlzLl9jb25maWcoZSksdGhpcy5faW5pdHx8dGhpcy5fc2V0dXAoKSx0aGlzLl9leHBsb2RlKCksdGhpcy5hbGxvd1JvbGx1cD90aGlzLl9yb2xsdXAoKTp0aGlzLl9leHBsb2RlUm9sbHVwcygpLHRoaXMuX3JlZHVjZSgpLHRoaXMuX3NvcnQoKX0sX2FkZExhbmdQYWNrOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1uLm5hbWUscyxvLHU9dGhpcy5nZXRNb2R1bGVJbmZvKHIpO3JldHVybiB1fHwocz1TKG4ucGtnfHxpLHIsYSwhMCksbz17cGF0aDpzLGludGw6ITAsbGFuZ1BhY2s6ITAsZXh0Om4uZXh0LGdyb3VwOm4uZ3JvdXAsc3VwZXJzZWRlczpbXX0sbi5yb290JiYoby5yb290PW4ucm9vdCksbi5iYXNlJiYoby5iYXNlPW4uYmFzZSksbi5jb25maWdGbiYmKG8uY29uZmlnRm49bi5jb25maWdGbiksdGhpcy5hZGRNb2R1bGUobyxyKSx0JiYoZS5FbnYubGFuZz1lLkVudi5sYW5nfHx7fSxlLkVudi5sYW5nW3RdPWUuRW52LmxhbmdbdF18fHt9LGUuRW52LmxhbmdbdF1baV09ITApKSx0aGlzLmdldE1vZHVsZUluZm8ocil9LF9zZXR1cDpmdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kdWxlSW5mbyxuLHIsaSxvLHUsYTtmb3IobiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihvPXRbbl0sbyYmKG8ucmVxdWlyZXM9di5kZWR1cGUoby5yZXF1aXJlcyksby5sYW5nJiYoYT10aGlzLmdldExhbmdQYWNrTmFtZShoLG4pLHRoaXMuX2FkZExhbmdQYWNrKG51bGwsbyxhKSkpKTt1PXt9LHRoaXMuaWdub3JlUmVnaXN0ZXJlZHx8ZS5taXgodSxzLm1vZHMpLHRoaXMuaWdub3JlJiZlLm1peCh1LHYuaGFzaCh0aGlzLmlnbm9yZSkpO2ZvcihpIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShpKSYmZS5taXgodSx0aGlzLmdldFByb3ZpZGVzKGkpKTtpZih0aGlzLmZvcmNlKWZvcihyPTA7cjx0aGlzLmZvcmNlLmxlbmd0aDtyKyspdGhpcy5mb3JjZVtyXWluIHUmJmRlbGV0ZSB1W3RoaXMuZm9yY2Vbcl1dO2UubWl4KHRoaXMubG9hZGVkLHUpLHRoaXMuX2luaXQ9ITB9LGdldExhbmdQYWNrTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiJsYW5nLyIrdCsoZT8iXyIrZToiIil9LF9leHBsb2RlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZXF1aXJlZCxuLHIsaT17fSxzPXRoaXMsbyx1O3MuZGlydHk9ITEscy5fZXhwbG9kZVJvbGx1cHMoKSx0PXMucmVxdWlyZWQ7Zm9yKG8gaW4gdCl0Lmhhc093blByb3BlcnR5KG8pJiYoaVtvXXx8KGlbb109ITAsbj1zLmdldE1vZHVsZShvKSxuJiYodT1uLmV4cG91bmQsdSYmKHRbdV09cy5nZXRNb2R1bGUodSkscj1zLmdldFJlcXVpcmVzKHRbdV0pLGUubWl4KHQsdi5oYXNoKHIpKSkscj1zLmdldFJlcXVpcmVzKG4pLGUubWl4KHQsdi5oYXNoKHIpKSkpKX0sX3BhdHRlcm5UZXN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaW5kZXhPZih0KT4tMX0sZ2V0TW9kdWxlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO3ZhciBuLHIsaSxzPXRoaXMuZ2V0TW9kdWxlSW5mbyh0KSxvPXRoaXMucGF0dGVybnM7aWYoIXN8fHMmJnMuZXh0KWZvcihpIGluIG8paWYoby5oYXNPd25Qcm9wZXJ0eShpKSl7bj1vW2ldLG4udGVzdHx8KG4udGVzdD10aGlzLl9wYXR0ZXJuVGVzdCk7aWYobi50ZXN0KHQsaSkpe3I9bjticmVha319cmV0dXJuIHM/ciYmcyYmci5jb25maWdGbiYmIXMuY29uZmlnRm4mJihzLmNvbmZpZ0ZuPXIuY29uZmlnRm4scy5jb25maWdGbihzKSk6ciYmKG4uYWN0aW9uP24uYWN0aW9uLmNhbGwodGhpcyx0LGkpOihzPXRoaXMuYWRkTW9kdWxlKGUubWVyZ2Uocix7dGVzdDp2b2lkIDAsdGVtcDohMH0pLHQpLHIuY29uZmlnRm4mJihzLmNvbmZpZ0ZuPXIuY29uZmlnRm4pKSksc30sX3JvbGx1cDpmdW5jdGlvbigpe30sX3JlZHVjZTpmdW5jdGlvbihlKXtlPWV8fHRoaXMucmVxdWlyZWQ7dmFyIHQsbixyLGkscz10aGlzLmxvYWRUeXBlLG89dGhpcy5pZ25vcmU/di5oYXNoKHRoaXMuaWdub3JlKTohMTtmb3IodCBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkodCkpe2k9dGhpcy5nZXRNb2R1bGUodCksKCh0aGlzLmxvYWRlZFt0XXx8d1t0XSkmJiF0aGlzLmZvcmNlTWFwW3RdJiYhdGhpcy5pZ25vcmVSZWdpc3RlcmVkfHxzJiZpJiZpLnR5cGUhPT1zKSYmZGVsZXRlIGVbdF0sbyYmb1t0XSYmZGVsZXRlIGVbdF0scj1pJiZpLnN1cGVyc2VkZXM7aWYocilmb3Iobj0wO248ci5sZW5ndGg7bisrKXJbbl1pbiBlJiZkZWxldGUgZVtyW25dXX1yZXR1cm4gZX0sX2ZpbmlzaDpmdW5jdGlvbihlLHQpe20ucnVubmluZz0hMTt2YXIgbj10aGlzLm9uRW5kO24mJm4uY2FsbCh0aGlzLmNvbnRleHQse21zZzplLGRhdGE6dGhpcy5kYXRhLHN1Y2Nlc3M6dH0pLHRoaXMuX2NvbnRpbnVlKCl9LF9vblN1Y2Nlc3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5tZXJnZSh0LnNraXBwZWQpLHIsaT1bXSxzPXQucmVxdWlyZVJlZ2lzdHJhdGlvbixvLHUsZixsO2ZvcihmIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShmKSYmZGVsZXRlIHQuaW5zZXJ0ZWRbZl07dC5za2lwcGVkPXt9O2ZvcihmIGluIHQuaW5zZXJ0ZWQpdC5pbnNlcnRlZC5oYXNPd25Qcm9wZXJ0eShmKSYmKGw9dC5nZXRNb2R1bGUoZiksIWx8fCFzfHxsLnR5cGUhPT1hfHxmIGluIFlVSS5FbnYubW9kcz9lLm1peCh0LmxvYWRlZCx0LmdldFByb3ZpZGVzKGYpKTppLnB1c2goZikpO3I9dC5vblN1Y2Nlc3MsdT1pLmxlbmd0aD8ibm90cmVnaXN0ZXJlZCI6InN1Y2Nlc3MiLG89IWkubGVuZ3RoLHImJnIuY2FsbCh0LmNvbnRleHQse21zZzp1LGRhdGE6dC5kYXRhLHN1Y2Nlc3M6byxmYWlsZWQ6aSxza2lwcGVkOm59KSx0Ll9maW5pc2godSxvKX0sX29uUHJvZ3Jlc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuO2lmKGUuZGF0YSYmZS5kYXRhLmxlbmd0aClmb3Iobj0wO248ZS5kYXRhLmxlbmd0aDtuKyspZS5kYXRhW25dPXQuZ2V0TW9kdWxlKGUuZGF0YVtuXS5uYW1lKTt0Lm9uUHJvZ3Jlc3MmJnQub25Qcm9ncmVzcy5jYWxsKHQuY29udGV4dCx7bmFtZTplLnVybCxkYXRhOmUuZGF0YX0pfSxfb25GYWlsdXJlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMub25GYWlsdXJlLG49W10scj0wLGk9ZS5lcnJvcnMubGVuZ3RoO2ZvcihyO3I8aTtyKyspbi5wdXNoKGUuZXJyb3JzW3JdLmVycm9yKTtuPW4uam9pbigiLCIpLHQmJnQuY2FsbCh0aGlzLmNvbnRleHQse21zZzpuLGRhdGE6dGhpcy5kYXRhLHN1Y2Nlc3M6ITF9KSx0aGlzLl9maW5pc2gobiwhMSl9LF9vblRpbWVvdXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5vblRpbWVvdXQ7dCYmdC5jYWxsKHRoaXMuY29udGV4dCx7bXNnOiJ0aW1lb3V0IixkYXRhOnRoaXMuZGF0YSxzdWNjZXNzOiExLHRyYW5zYWN0aW9uOmV9KX0sX3NvcnQ6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMucmVxdWlyZWQsbj17fTt0aGlzLnNvcnRlZD1bXTtmb3IoZSBpbiB0KSFuW2VdJiZ0Lmhhc093blByb3BlcnR5KGUpJiYKdGhpcy5fdmlzaXQoZSxuKX0sX3Zpc2l0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbyx1LGEsZixsO3RbZV09ITAsbj10aGlzLnJlcXVpcmVkLGk9dGhpcy5tb2R1bGVJbmZvW2VdLHI9dGhpcy5jb25kaXRpb25zW2VdfHx7fTtpZihpKXtvPWkuZXhwYW5kZWR8fGkucmVxdWlyZXM7Zm9yKGY9MCxsPW8ubGVuZ3RoO2Y8bDsrK2Ypcz1vW2ZdLHU9cltzXSxhPXUmJighdS53aGVufHx1LndoZW49PT0iYWZ0ZXIiKSxuW3NdJiYhdFtzXSYmIWEmJnRoaXMuX3Zpc2l0KHMsdCl9dGhpcy5zb3J0ZWQucHVzaChlKX0sX2luc2VydDpmdW5jdGlvbih0LG4scixpKXt0JiZ0aGlzLl9jb25maWcodCk7dmFyIHM9dGhpcy5yZXNvbHZlKCFpKSxvPXRoaXMsZj0wLGw9MCxjPXt9LGgscDtvLl9yZWZldGNoPVtdLHImJihzW3I9PT1hP3U6YV09W10pLG8uZmV0Y2hDU1N8fChzLmNzcz1bXSkscy5qcy5sZW5ndGgmJmYrKyxzLmNzcy5sZW5ndGgmJmYrKyxwPWZ1bmN0aW9uKHQpe2wrKzt2YXIgbj17fSxyPTAsaT0wLHM9IiIsdSxhLHA7aWYodCYmdC5lcnJvcnMpZm9yKHI9MDtyPHQuZXJyb3JzLmxlbmd0aDtyKyspdC5lcnJvcnNbcl0ucmVxdWVzdD9zPXQuZXJyb3JzW3JdLnJlcXVlc3QudXJsOnM9dC5lcnJvcnNbcl0sbltzXT1zO2lmKHQmJnQuZGF0YSYmdC5kYXRhLmxlbmd0aCYmdC50eXBlPT09InN1Y2Nlc3MiKWZvcihyPTA7cjx0LmRhdGEubGVuZ3RoO3IrKyl7by5pbnNlcnRlZFt0LmRhdGFbcl0ubmFtZV09ITA7aWYodC5kYXRhW3JdLmxhbmd8fHQuZGF0YVtyXS5za2lubmFibGUpZGVsZXRlIG8uaW5zZXJ0ZWRbdC5kYXRhW3JdLm5hbWVdLG8uX3JlZmV0Y2gucHVzaCh0LmRhdGFbcl0ubmFtZSl9aWYobD09PWYpe28uX2xvYWRpbmc9bnVsbDtpZihvLl9yZWZldGNoLmxlbmd0aCl7Zm9yKHI9MDtyPG8uX3JlZmV0Y2gubGVuZ3RoO3IrKyl7aD1vLmdldFJlcXVpcmVzKG8uZ2V0TW9kdWxlKG8uX3JlZmV0Y2hbcl0pKTtmb3IoaT0wO2k8aC5sZW5ndGg7aSsrKW8uaW5zZXJ0ZWRbaFtpXV18fChjW2hbaV1dPWhbaV0pfWM9ZS5PYmplY3Qua2V5cyhjKTtpZihjLmxlbmd0aCl7by5yZXF1aXJlKGMpLHA9by5yZXNvbHZlKCEwKTtpZihwLmNzc01vZHMubGVuZ3RoKXtmb3Iocj0wO3I8cC5jc3NNb2RzLmxlbmd0aDtyKyspYT1wLmNzc01vZHNbcl0ubmFtZSxkZWxldGUgWVVJLkVudi5fY3NzTG9hZGVkW2FdLG8uaXNDU1NMb2FkZWQoYSkmJihvLmluc2VydGVkW2FdPSEwLGRlbGV0ZSBvLnJlcXVpcmVkW2FdKTtvLnNvcnRlZD1bXSxvLl9zb3J0KCl9dD1udWxsLG8uX2luc2VydCgpfX10JiZ0LmZuJiYodT10LmZuLGRlbGV0ZSB0LmZuLHUuY2FsbChvLHQpKX19LHRoaXMuX2xvYWRpbmc9ITA7aWYoIXMuanMubGVuZ3RoJiYhcy5jc3MubGVuZ3RoKXtsPS0xLHAoe2ZuOm8uX29uU3VjY2Vzc30pO3JldHVybn1zLmNzcy5sZW5ndGgmJmUuR2V0LmNzcyhzLmNzcyx7ZGF0YTpzLmNzc01vZHMsYXR0cmlidXRlczpvLmNzc0F0dHJpYnV0ZXMsaW5zZXJ0QmVmb3JlOm8uaW5zZXJ0QmVmb3JlLGNoYXJzZXQ6by5jaGFyc2V0LHRpbWVvdXQ6by50aW1lb3V0LGNvbnRleHQ6byxvblByb2dyZXNzOmZ1bmN0aW9uKGUpe28uX29uUHJvZ3Jlc3MuY2FsbChvLGUpfSxvblRpbWVvdXQ6ZnVuY3Rpb24oZSl7by5fb25UaW1lb3V0LmNhbGwobyxlKX0sb25TdWNjZXNzOmZ1bmN0aW9uKGUpe2UudHlwZT0ic3VjY2VzcyIsZS5mbj1vLl9vblN1Y2Nlc3MscC5jYWxsKG8sZSl9LG9uRmFpbHVyZTpmdW5jdGlvbihlKXtlLnR5cGU9ImZhaWx1cmUiLGUuZm49by5fb25GYWlsdXJlLHAuY2FsbChvLGUpfX0pLHMuanMubGVuZ3RoJiZlLkdldC5qcyhzLmpzLHtkYXRhOnMuanNNb2RzLGluc2VydEJlZm9yZTpvLmluc2VydEJlZm9yZSxhdHRyaWJ1dGVzOm8uanNBdHRyaWJ1dGVzLGNoYXJzZXQ6by5jaGFyc2V0LHRpbWVvdXQ6by50aW1lb3V0LGF1dG9wdXJnZTohMSxjb250ZXh0Om8sYXN5bmM6by5hc3luYyxvblByb2dyZXNzOmZ1bmN0aW9uKGUpe28uX29uUHJvZ3Jlc3MuY2FsbChvLGUpfSxvblRpbWVvdXQ6ZnVuY3Rpb24oZSl7by5fb25UaW1lb3V0LmNhbGwobyxlKX0sb25TdWNjZXNzOmZ1bmN0aW9uKGUpe2UudHlwZT0ic3VjY2VzcyIsZS5mbj1vLl9vblN1Y2Nlc3MscC5jYWxsKG8sZSl9LG9uRmFpbHVyZTpmdW5jdGlvbihlKXtlLnR5cGU9ImZhaWx1cmUiLGUuZm49by5fb25GYWlsdXJlLHAuY2FsbChvLGUpfX0pfSxfY29udGludWU6ZnVuY3Rpb24oKXshbS5ydW5uaW5nJiZtLnNpemUoKT4wJiYobS5ydW5uaW5nPSEwLG0ubmV4dCgpKCkpfSxpbnNlcnQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXRoaXMscz1lLm1lcmdlKHRoaXMpO2RlbGV0ZSBzLnJlcXVpcmUsZGVsZXRlIHMuZGlydHksbS5hZGQoZnVuY3Rpb24oKXtpLl9pbnNlcnQocyx0LG4scil9KSx0aGlzLl9jb250aW51ZSgpfSxsb2FkTmV4dDpmdW5jdGlvbigpe3JldHVybn0sX2ZpbHRlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5maWx0ZXIsaT10JiZ0IGluIHRoaXMuZmlsdGVycyxzPWkmJnRoaXMuZmlsdGVyc1t0XSxvPW58fCh0aGlzLmdldE1vZHVsZUluZm8odCl8fHt9KS5ncm91cHx8bnVsbDtyZXR1cm4gbyYmdGhpcy5ncm91cHNbb10mJnRoaXMuZ3JvdXBzW29dLmZpbHRlciYmKHM9dGhpcy5ncm91cHNbb10uZmlsdGVyLGk9ITApLGUmJihpJiYocj1iLmlzU3RyaW5nKHMpP3RoaXMuRklMVEVSX0RFRlNbcy50b1VwcGVyQ2FzZSgpXXx8bnVsbDpzKSxyJiYoZT1lLnJlcGxhY2UobmV3IFJlZ0V4cChyLnNlYXJjaEV4cCwiZyIpLHIucmVwbGFjZVN0cikpKSxlfSxfdXJsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fZmlsdGVyKChufHx0aGlzLmJhc2V8fCIiKStlLHQpfSxyZXNvbHZlOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcyxzPXtqczpbXSxqc01vZHM6W10sY3NzOltdLGNzc01vZHM6W119LG87KHIuc2tpbi5vdmVycmlkZXN8fHIuc2tpbi5kZWZhdWx0U2tpbiE9PWx8fHIuaWdub3JlUmVnaXN0ZXJlZCkmJnIuX3Jlc2V0TW9kdWxlcygpLGUmJnIuY2FsY3VsYXRlKCksdD10fHxyLnNvcnRlZCxvPWZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWUuZ3JvdXAmJnIuZ3JvdXBzW2UuZ3JvdXBdfHxuLGk7dC5hc3luYz09PSExJiYoZS5hc3luYz10LmFzeW5jKSxpPWUuZnVsbHBhdGg/ci5fZmlsdGVyKGUuZnVsbHBhdGgsZS5uYW1lKTpyLl91cmwoZS5wYXRoLGUubmFtZSx0LmJhc2V8fGUuYmFzZSk7aWYoZS5hdHRyaWJ1dGVzfHxlLmFzeW5jPT09ITEpaT17dXJsOmksYXN5bmM6ZS5hc3luY30sZS5hdHRyaWJ1dGVzJiYoaS5hdHRyaWJ1dGVzPWUuYXR0cmlidXRlcyk7c1tlLnR5cGVdLnB1c2goaSksc1tlLnR5cGUrIk1vZHMiXS5wdXNoKGUpfX07dmFyIGY9ci5pZ25vcmVSZWdpc3RlcmVkP3t9OnIuaW5zZXJ0ZWQsYz17fSxoLHAsZCx2LG0sZyx5LGI7Zm9yKGI9MCx5PXQubGVuZ3RoO2I8eTtiKyspe2c9ci5nZXRNb2R1bGUodFtiXSk7aWYoIWd8fGZbZy5uYW1lXSljb250aW51ZTttPXIuZ3JvdXBzW2cuZ3JvdXBdLGQ9ci5jb21ib0Jhc2U7aWYobSl7aWYoIW0uY29tYmluZXx8Zy5mdWxscGF0aCl7byhnKTtjb250aW51ZX1nLmNvbWJpbmU9ITAsdHlwZW9mIG0ucm9vdD09InN0cmluZyImJihnLnJvb3Q9bS5yb290KSxkPW0uY29tYm9CYXNlfHxkLHY9bS5jb21ib1NlcCxoPW0ubWF4VVJMTGVuZ3RofWVsc2UgaWYoIXIuY29tYmluZSl7byhnKTtjb250aW51ZX1pZighZy5jb21iaW5lJiZnLmV4dCl7byhnKTtjb250aW51ZX1jW2RdPWNbZF18fHtqczpbXSxqc01vZHM6W10sY3NzOltdLGNzc01vZHM6W119LHA9Y1tkXSxwLmdyb3VwPWcuZ3JvdXAscC5jb21ib1NlcD12fHxyLmNvbWJvU2VwLHAubWF4VVJMTGVuZ3RoPWh8fHIubWF4VVJMTGVuZ3RoLHBbZy50eXBlKyJNb2RzIl0ucHVzaChnKX12YXIgdyxFLFMseCxULE4sQztmb3IoZCBpbiBjKWlmKGMuaGFzT3duUHJvcGVydHkoZCkpe3A9Y1tkXSx2PXAuY29tYm9TZXAsaD1wLm1heFVSTExlbmd0aDtmb3IoQyBpbiBwKWlmKEM9PT1hfHxDPT09dSl7RT1wW0MrIk1vZHMiXSxUPVtdO2ZvcihiPTAseT1FLmxlbmd0aDtiPHk7Yis9MSlnPUVbYl0sTj0odHlwZW9mIGcucm9vdD09InN0cmluZyI/Zy5yb290OnIucm9vdCkrKGcucGF0aHx8Zy5mdWxscGF0aCksVC5wdXNoKHIuX2ZpbHRlcihOLGcubmFtZSkpO1M9ZCtULmpvaW4odikseD1TLmxlbmd0aCxoPD1kLmxlbmd0aCYmKGg9aSk7aWYoVC5sZW5ndGgpaWYoeD5oKXt3PVtdO2ZvcihiPTAseT1ULmxlbmd0aDtiPHk7YisrKXcucHVzaChUW2JdKSxTPWQrdy5qb2luKHYpLFMubGVuZ3RoPmgmJihOPXcucG9wKCksUz1kK3cuam9pbih2KSxzW0NdLnB1c2goci5fZmlsdGVyKFMsbnVsbCxwLmdyb3VwKSksdz1bXSxOJiZ3LnB1c2goTikpO3cubGVuZ3RoJiYoUz1kK3cuam9pbih2KSxzW0NdLnB1c2goci5fZmlsdGVyKFMsbnVsbCxwLmdyb3VwKSkpfWVsc2Ugc1tDXS5wdXNoKHIuX2ZpbHRlcihTLG51bGwscC5ncm91cCkpO3NbQysiTW9kcyJdPXNbQysiTW9kcyJdLmNvbmNhdChFKX19cmV0dXJuIHN9LGxvYWQ6ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO3ZhciB0PXRoaXMsbj10LnJlc29sdmUoITApO3QuZGF0YT1uLHQub25FbmQ9ZnVuY3Rpb24oKXtlLmFwcGx5KHQuY29udGV4dHx8dCxhcmd1bWVudHMpfSx0Lmluc2VydCgpfX19LCIzLjE3LjIiLHtyZXF1aXJlczpbImdldCIsImZlYXR1cmVzIl19KSxZVUkuYWRkKCJsb2FkZXItcm9sbHVwIixmdW5jdGlvbihlLHQpe2UuTG9hZGVyLnByb3RvdHlwZS5fcm9sbHVwPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaT10aGlzLnJlcXVpcmVkLHMsbz10aGlzLm1vZHVsZUluZm8sdSxhLGY7aWYodGhpcy5kaXJ0eXx8IXRoaXMucm9sbHVwcyl7dGhpcy5yb2xsdXBzPXt9O2ZvcihlIGluIG8pby5oYXNPd25Qcm9wZXJ0eShlKSYmKG49dGhpcy5nZXRNb2R1bGUoZSksbiYmbi5yb2xsdXAmJih0aGlzLnJvbGx1cHNbZV09bikpfWZvcig7Oyl7dT0hMTtmb3IoZSBpbiB0aGlzLnJvbGx1cHMpaWYodGhpcy5yb2xsdXBzLmhhc093blByb3BlcnR5KGUpJiYhaVtlXSYmKCF0aGlzLmxvYWRlZFtlXXx8dGhpcy5mb3JjZU1hcFtlXSkpe249dGhpcy5nZXRNb2R1bGUoZSkscj1uLnN1cGVyc2VkZXN8fFtdLHM9ITE7aWYoIW4ucm9sbHVwKWNvbnRpbnVlO2E9MDtmb3IodD0wO3Q8ci5sZW5ndGg7dCsrKXtmPW9bclt0XV07aWYodGhpcy5sb2FkZWRbclt0XV0mJiF0aGlzLmZvcmNlTWFwW3JbdF1dKXtzPSExO2JyZWFrfWlmKGlbclt0XV0mJm4udHlwZT09PWYudHlwZSl7YSsrLHM9YT49bi5yb2xsdXA7aWYocylicmVha319cyYmKGlbZV09ITAsdT0hMCx0aGlzLmdldFJlcXVpcmVzKG4pKX1pZighdSlicmVha319fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJsb2FkZXItYmFzZSJdfSksWVVJLmFkZCgibG9hZGVyLXl1aTMiLGZ1bmN0aW9uKGUsdCl7WVVJLkVudltlLnZlcnNpb25dLm1vZHVsZXM9WVVJLkVudltlLnZlcnNpb25dLm1vZHVsZXN8fHt9LGUubWl4KFlVSS5FbnZbZS52ZXJzaW9uXS5tb2R1bGVzLHsiYWxpZ24tcGx1Z2luIjp7cmVxdWlyZXM6WyJub2RlLXNjcmVlbiIsIm5vZGUtcGx1Z2luaG9zdCJdfSxhbmltOnt1c2U6WyJhbmltLWJhc2UiLCJhbmltLWNvbG9yIiwiYW5pbS1jdXJ2ZSIsImFuaW0tZWFzaW5nIiwiYW5pbS1ub2RlLXBsdWdpbiIsImFuaW0tc2Nyb2xsIiwiYW5pbS14eSJdfSwiYW5pbS1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlLWJhc2UiLCJub2RlLXN0eWxlIiwiY29sb3ItYmFzZSJdfSwiYW5pbS1jb2xvciI6e3JlcXVpcmVzOlsiYW5pbS1iYXNlIl19LCJhbmltLWN1cnZlIjp7cmVxdWlyZXM6WyJhbmltLXh5Il19LCJhbmltLWVhc2luZyI6e3JlcXVpcmVzOlsiYW5pbS1iYXNlIl19LCJhbmltLW5vZGUtcGx1Z2luIjp7cmVxdWlyZXM6WyJub2RlLXBsdWdpbmhvc3QiLCJhbmltLWJhc2UiXX0sImFuaW0tc2Nyb2xsIjp7cmVxdWlyZXM6WyJhbmltLWJhc2UiXX0sImFuaW0tc2hhcGUiOntyZXF1aXJlczpbImFuaW0tYmFzZSIsImFuaW0tZWFzaW5nIiwiYW5pbS1jb2xvciIKLCJtYXRyaXgiXX0sImFuaW0tc2hhcGUtdHJhbnNmb3JtIjp7dXNlOlsiYW5pbS1zaGFwZSJdfSwiYW5pbS14eSI6e3JlcXVpcmVzOlsiYW5pbS1iYXNlIiwibm9kZS1zY3JlZW4iXX0sYXBwOnt1c2U6WyJhcHAtYmFzZSIsImFwcC1jb250ZW50IiwiYXBwLXRyYW5zaXRpb25zIiwibGF6eS1tb2RlbC1saXN0IiwibW9kZWwiLCJtb2RlbC1saXN0IiwibW9kZWwtc3luYy1yZXN0IiwibW9kZWwtc3luYy1sb2NhbCIsInJvdXRlciIsInZpZXciLCJ2aWV3LW5vZGUtbWFwIl19LCJhcHAtYmFzZSI6e3JlcXVpcmVzOlsiY2xhc3NuYW1lbWFuYWdlciIsInBqYXgtYmFzZSIsInJvdXRlciIsInZpZXciXX0sImFwcC1jb250ZW50Ijp7cmVxdWlyZXM6WyJhcHAtYmFzZSIsInBqYXgtY29udGVudCJdfSwiYXBwLXRyYW5zaXRpb25zIjp7cmVxdWlyZXM6WyJhcHAtYmFzZSJdfSwiYXBwLXRyYW5zaXRpb25zLWNzcyI6e3R5cGU6ImNzcyJ9LCJhcHAtdHJhbnNpdGlvbnMtbmF0aXZlIjp7Y29uZGl0aW9uOntuYW1lOiJhcHAtdHJhbnNpdGlvbnMtbmF0aXZlIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQ/dC5kb2N1bWVudEVsZW1lbnQ6bnVsbDtyZXR1cm4gbiYmbi5zdHlsZT8iTW96VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwiV2Via2l0VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwidHJhbnNpdGlvbiJpbiBuLnN0eWxlOiExfSx0cmlnZ2VyOiJhcHAtdHJhbnNpdGlvbnMifSxyZXF1aXJlczpbImFwcC10cmFuc2l0aW9ucyIsImFwcC10cmFuc2l0aW9ucy1jc3MiLCJwYXJhbGxlbCIsInRyYW5zaXRpb24iXX0sImFycmF5LWV4dHJhcyI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImFycmF5LWludm9rZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sYXJyYXlsaXN0OntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJhcnJheWxpc3QtYWRkIjp7cmVxdWlyZXM6WyJhcnJheWxpc3QiXX0sImFycmF5bGlzdC1maWx0ZXIiOntyZXF1aXJlczpbImFycmF5bGlzdCJdfSxhcnJheXNvcnQ6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImFzeW5jLXF1ZXVlIjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20iXX0sYXR0cmlidXRlOnt1c2U6WyJhdHRyaWJ1dGUtYmFzZSIsImF0dHJpYnV0ZS1jb21wbGV4Il19LCJhdHRyaWJ1dGUtYmFzZSI6e3JlcXVpcmVzOlsiYXR0cmlidXRlLWNvcmUiLCJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImF0dHJpYnV0ZS1leHRyYXMiXX0sImF0dHJpYnV0ZS1jb21wbGV4Ijp7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtYmFzZSJdfSwiYXR0cmlidXRlLWNvcmUiOntyZXF1aXJlczpbIm9vcCJdfSwiYXR0cmlidXRlLWV2ZW50cyI6e3VzZTpbImF0dHJpYnV0ZS1vYnNlcnZhYmxlIl19LCJhdHRyaWJ1dGUtZXh0cmFzIjp7cmVxdWlyZXM6WyJvb3AiXX0sImF0dHJpYnV0ZS1vYnNlcnZhYmxlIjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20iXX0sYXV0b2NvbXBsZXRlOnt1c2U6WyJhdXRvY29tcGxldGUtYmFzZSIsImF1dG9jb21wbGV0ZS1zb3VyY2VzIiwiYXV0b2NvbXBsZXRlLWxpc3QiLCJhdXRvY29tcGxldGUtcGx1Z2luIl19LCJhdXRvY29tcGxldGUtYmFzZSI6e29wdGlvbmFsOlsiYXV0b2NvbXBsZXRlLXNvdXJjZXMiXSxyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsImJhc2UtYnVpbGQiLCJlc2NhcGUiLCJldmVudC12YWx1ZWNoYW5nZSIsIm5vZGUtYmFzZSJdfSwiYXV0b2NvbXBsZXRlLWZpbHRlcnMiOntyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsInRleHQtd29yZGJyZWFrIl19LCJhdXRvY29tcGxldGUtZmlsdGVycy1hY2NlbnRmb2xkIjp7cmVxdWlyZXM6WyJhcnJheS1leHRyYXMiLCJ0ZXh0LWFjY2VudGZvbGQiLCJ0ZXh0LXdvcmRicmVhayJdfSwiYXV0b2NvbXBsZXRlLWhpZ2hsaWdodGVycyI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiaGlnaGxpZ2h0LWJhc2UiXX0sImF1dG9jb21wbGV0ZS1oaWdobGlnaHRlcnMtYWNjZW50Zm9sZCI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiaGlnaGxpZ2h0LWFjY2VudGZvbGQiXX0sImF1dG9jb21wbGV0ZS1saXN0Ijp7YWZ0ZXI6WyJhdXRvY29tcGxldGUtc291cmNlcyJdLGxhbmc6WyJlbiIsImVzIiwiaHUiLCJpdCJdLHJlcXVpcmVzOlsiYXV0b2NvbXBsZXRlLWJhc2UiLCJldmVudC1yZXNpemUiLCJub2RlLXNjcmVlbiIsInNlbGVjdG9yLWNzczMiLCJzaGltLXBsdWdpbiIsIndpZGdldCIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1wb3NpdGlvbi1hbGlnbiJdLHNraW5uYWJsZTohMH0sImF1dG9jb21wbGV0ZS1saXN0LWtleXMiOntjb25kaXRpb246e25hbWU6ImF1dG9jb21wbGV0ZS1saXN0LWtleXMiLHRlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIWUuVUEuaW9zJiYhZS5VQS5hbmRyb2lkfSx0cmlnZ2VyOiJhdXRvY29tcGxldGUtbGlzdCJ9LHJlcXVpcmVzOlsiYXV0b2NvbXBsZXRlLWxpc3QiLCJiYXNlLWJ1aWxkIl19LCJhdXRvY29tcGxldGUtcGx1Z2luIjp7cmVxdWlyZXM6WyJhdXRvY29tcGxldGUtbGlzdCIsIm5vZGUtcGx1Z2luaG9zdCJdfSwiYXV0b2NvbXBsZXRlLXNvdXJjZXMiOntvcHRpb25hbDpbImlvLWJhc2UiLCJqc29uLXBhcnNlIiwianNvbnAiLCJ5cWwiXSxyZXF1aXJlczpbImF1dG9jb21wbGV0ZS1iYXNlIl19LGF4ZXM6e3VzZTpbImF4aXMtbnVtZXJpYyIsImF4aXMtY2F0ZWdvcnkiLCJheGlzLXRpbWUiLCJheGlzLXN0YWNrZWQiXX0sImF4ZXMtYmFzZSI6e3VzZTpbImF4aXMtbnVtZXJpYy1iYXNlIiwiYXhpcy1jYXRlZ29yeS1iYXNlIiwiYXhpcy10aW1lLWJhc2UiLCJheGlzLXN0YWNrZWQtYmFzZSJdfSxheGlzOntyZXF1aXJlczpbImRvbSIsIndpZGdldCIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1zdGFjayIsImdyYXBoaWNzIiwiYXhpcy1iYXNlIl19LCJheGlzLWJhc2UiOntyZXF1aXJlczpbImNsYXNzbmFtZW1hbmFnZXIiLCJkYXRhdHlwZS1udW1iZXIiLCJkYXRhdHlwZS1kYXRlIiwiYmFzZSIsImV2ZW50LWN1c3RvbSJdfSwiYXhpcy1jYXRlZ29yeSI6e3JlcXVpcmVzOlsiYXhpcyIsImF4aXMtY2F0ZWdvcnktYmFzZSJdfSwiYXhpcy1jYXRlZ29yeS1iYXNlIjp7cmVxdWlyZXM6WyJheGlzLWJhc2UiXX0sImF4aXMtbnVtZXJpYyI6e3JlcXVpcmVzOlsiYXhpcyIsImF4aXMtbnVtZXJpYy1iYXNlIl19LCJheGlzLW51bWVyaWMtYmFzZSI6e3JlcXVpcmVzOlsiYXhpcy1iYXNlIl19LCJheGlzLXN0YWNrZWQiOntyZXF1aXJlczpbImF4aXMtbnVtZXJpYyIsImF4aXMtc3RhY2tlZC1iYXNlIl19LCJheGlzLXN0YWNrZWQtYmFzZSI6e3JlcXVpcmVzOlsiYXhpcy1udW1lcmljLWJhc2UiXX0sImF4aXMtdGltZSI6e3JlcXVpcmVzOlsiYXhpcyIsImF4aXMtdGltZS1iYXNlIl19LCJheGlzLXRpbWUtYmFzZSI6e3JlcXVpcmVzOlsiYXhpcy1iYXNlIl19LGJhc2U6e3VzZTpbImJhc2UtYmFzZSIsImJhc2UtcGx1Z2luaG9zdCIsImJhc2UtYnVpbGQiXX0sImJhc2UtYmFzZSI6e3JlcXVpcmVzOlsiYXR0cmlidXRlLWJhc2UiLCJiYXNlLWNvcmUiLCJiYXNlLW9ic2VydmFibGUiXX0sImJhc2UtYnVpbGQiOntyZXF1aXJlczpbImJhc2UtYmFzZSJdfSwiYmFzZS1jb3JlIjp7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtY29yZSJdfSwiYmFzZS1vYnNlcnZhYmxlIjp7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImJhc2UtY29yZSJdfSwiYmFzZS1wbHVnaW5ob3N0Ijp7cmVxdWlyZXM6WyJiYXNlLWJhc2UiLCJwbHVnaW5ob3N0Il19LGJ1dHRvbjp7cmVxdWlyZXM6WyJidXR0b24tY29yZSIsImNzc2J1dHRvbiIsIndpZGdldCJdfSwiYnV0dG9uLWNvcmUiOntyZXF1aXJlczpbImF0dHJpYnV0ZS1jb3JlIiwiY2xhc3NuYW1lbWFuYWdlciIsIm5vZGUtYmFzZSIsImVzY2FwZSJdfSwiYnV0dG9uLWdyb3VwIjp7cmVxdWlyZXM6WyJidXR0b24tcGx1Z2luIiwiY3NzYnV0dG9uIiwid2lkZ2V0Il19LCJidXR0b24tcGx1Z2luIjp7cmVxdWlyZXM6WyJidXR0b24tY29yZSIsImNzc2J1dHRvbiIsIm5vZGUtcGx1Z2luaG9zdCJdfSxjYWNoZTp7dXNlOlsiY2FjaGUtYmFzZSIsImNhY2hlLW9mZmxpbmUiLCJjYWNoZS1wbHVnaW4iXX0sImNhY2hlLWJhc2UiOntyZXF1aXJlczpbImJhc2UiXX0sImNhY2hlLW9mZmxpbmUiOntyZXF1aXJlczpbImNhY2hlLWJhc2UiLCJqc29uIl19LCJjYWNoZS1wbHVnaW4iOntyZXF1aXJlczpbInBsdWdpbiIsImNhY2hlLWJhc2UiXX0sY2FsZW5kYXI6e3JlcXVpcmVzOlsiY2FsZW5kYXItYmFzZSIsImNhbGVuZGFybmF2aWdhdG9yIl0sc2tpbm5hYmxlOiEwfSwiY2FsZW5kYXItYmFzZSI6e2xhbmc6WyJkZSIsImVuIiwiZXMiLCJlcy1BUiIsImZyIiwiaHUiLCJpdCIsImphIiwibmItTk8iLCJubCIsInB0LUJSIiwicnUiLCJ6aC1IYW5zIiwiemgtSGFucy1DTiIsInpoLUhhbnQiLCJ6aC1IYW50LUhLIiwiemgtSEFOVC1UVyJdLHJlcXVpcmVzOlsid2lkZ2V0IiwiZGF0YXR5cGUtZGF0ZSIsImRhdGF0eXBlLWRhdGUtbWF0aCIsImNzc2dyaWRzIl0sc2tpbm5hYmxlOiEwfSxjYWxlbmRhcm5hdmlnYXRvcjp7cmVxdWlyZXM6WyJwbHVnaW4iLCJjbGFzc25hbWVtYW5hZ2VyIiwiZGF0YXR5cGUtZGF0ZSIsIm5vZGUiXSxza2lubmFibGU6ITB9LGNoYXJ0czp7dXNlOlsiY2hhcnRzLWJhc2UiXX0sImNoYXJ0cy1iYXNlIjp7cmVxdWlyZXM6WyJkb20iLCJldmVudC1tb3VzZWVudGVyIiwiZXZlbnQtdG91Y2giLCJncmFwaGljcy1ncm91cCIsImF4ZXMiLCJzZXJpZXMtcGllIiwic2VyaWVzLWxpbmUiLCJzZXJpZXMtbWFya2VyIiwic2VyaWVzLWFyZWEiLCJzZXJpZXMtc3BsaW5lIiwic2VyaWVzLWNvbHVtbiIsInNlcmllcy1iYXIiLCJzZXJpZXMtYXJlYXNwbGluZSIsInNlcmllcy1jb21ibyIsInNlcmllcy1jb21ib3NwbGluZSIsInNlcmllcy1saW5lLXN0YWNrZWQiLCJzZXJpZXMtbWFya2VyLXN0YWNrZWQiLCJzZXJpZXMtYXJlYS1zdGFja2VkIiwic2VyaWVzLXNwbGluZS1zdGFja2VkIiwic2VyaWVzLWNvbHVtbi1zdGFja2VkIiwic2VyaWVzLWJhci1zdGFja2VkIiwic2VyaWVzLWFyZWFzcGxpbmUtc3RhY2tlZCIsInNlcmllcy1jb21iby1zdGFja2VkIiwic2VyaWVzLWNvbWJvc3BsaW5lLXN0YWNrZWQiXX0sImNoYXJ0cy1sZWdlbmQiOntyZXF1aXJlczpbImNoYXJ0cy1iYXNlIl19LGNsYXNzbmFtZW1hbmFnZXI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImNsaWNrYWJsZS1yYWlsIjp7cmVxdWlyZXM6WyJzbGlkZXItYmFzZSJdfSxjb2xsZWN0aW9uOnt1c2U6WyJhcnJheS1leHRyYXMiLCJhcnJheWxpc3QiLCJhcnJheWxpc3QtYWRkIiwiYXJyYXlsaXN0LWZpbHRlciIsImFycmF5LWludm9rZSJdfSxjb2xvcjp7dXNlOlsiY29sb3ItYmFzZSIsImNvbG9yLWhzbCIsImNvbG9yLWhhcm1vbnkiXX0sImNvbG9yLWJhc2UiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJjb2xvci1oYXJtb255Ijp7cmVxdWlyZXM6WyJjb2xvci1oc2wiXX0sImNvbG9yLWhzbCI6e3JlcXVpcmVzOlsiY29sb3ItYmFzZSJdfSwiY29sb3ItaHN2Ijp7cmVxdWlyZXM6WyJjb2xvci1iYXNlIl19LGNvbnNvbGU6e2xhbmc6WyJlbiIsImVzIiwiaHUiLCJpdCIsImphIl0scmVxdWlyZXM6WyJ5dWktbG9nIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwiY29uc29sZS1maWx0ZXJzIjp7cmVxdWlyZXM6WyJwbHVnaW4iLCJjb25zb2xlIl0sc2tpbm5hYmxlOiEwfSwiY29udGVudC1lZGl0YWJsZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZWRpdG9yLXNlbGVjdGlvbiIsInN0eWxlc2hlZXQiLCJwbHVnaW4iXX0sY29udHJvbGxlcjp7dXNlOlsicm91dGVyIl19LGNvb2tpZTp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwiY3JlYXRlbGluay1iYXNlIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSJdfSxjc3NiYXNlOnthZnRlcjpbImNzc3Jlc2V0IiwiY3NzZm9udHMiLCJjc3NncmlkcyIsImNzc3Jlc2V0LWNvbnRleHQiLCJjc3Nmb250cy1jb250ZXh0IiwiY3NzZ3JpZHMtY29udGV4dCJdLHR5cGU6ImNzcyJ9LCJjc3NiYXNlLWNvbnRleHQiOnthZnRlcjpbImNzc3Jlc2V0IgosImNzc2ZvbnRzIiwiY3NzZ3JpZHMiLCJjc3NyZXNldC1jb250ZXh0IiwiY3NzZm9udHMtY29udGV4dCIsImNzc2dyaWRzLWNvbnRleHQiXSx0eXBlOiJjc3MifSxjc3NidXR0b246e3R5cGU6ImNzcyJ9LGNzc2ZvbnRzOnt0eXBlOiJjc3MifSwiY3NzZm9udHMtY29udGV4dCI6e3R5cGU6ImNzcyJ9LGNzc2dyaWRzOntvcHRpb25hbDpbImNzc25vcm1hbGl6ZSJdLHR5cGU6ImNzcyJ9LCJjc3Nncmlkcy1iYXNlIjp7b3B0aW9uYWw6WyJjc3Nub3JtYWxpemUiXSx0eXBlOiJjc3MifSwiY3NzZ3JpZHMtcmVzcG9uc2l2ZSI6e29wdGlvbmFsOlsiY3Nzbm9ybWFsaXplIl0scmVxdWlyZXM6WyJjc3NncmlkcyIsImNzc2dyaWRzLXJlc3BvbnNpdmUtYmFzZSJdLHR5cGU6ImNzcyJ9LCJjc3Nncmlkcy11bml0cyI6e29wdGlvbmFsOlsiY3Nzbm9ybWFsaXplIl0scmVxdWlyZXM6WyJjc3Nncmlkcy1iYXNlIl0sdHlwZToiY3NzIn0sY3Nzbm9ybWFsaXplOnt0eXBlOiJjc3MifSwiY3Nzbm9ybWFsaXplLWNvbnRleHQiOnt0eXBlOiJjc3MifSxjc3NyZXNldDp7dHlwZToiY3NzIn0sImNzc3Jlc2V0LWNvbnRleHQiOnt0eXBlOiJjc3MifSxkYXRhc2NoZW1hOnt1c2U6WyJkYXRhc2NoZW1hLWJhc2UiLCJkYXRhc2NoZW1hLWpzb24iLCJkYXRhc2NoZW1hLXhtbCIsImRhdGFzY2hlbWEtYXJyYXkiLCJkYXRhc2NoZW1hLXRleHQiXX0sImRhdGFzY2hlbWEtYXJyYXkiOntyZXF1aXJlczpbImRhdGFzY2hlbWEtYmFzZSJdfSwiZGF0YXNjaGVtYS1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIl19LCJkYXRhc2NoZW1hLWpzb24iOntyZXF1aXJlczpbImRhdGFzY2hlbWEtYmFzZSIsImpzb24iXX0sImRhdGFzY2hlbWEtdGV4dCI6e3JlcXVpcmVzOlsiZGF0YXNjaGVtYS1iYXNlIl19LCJkYXRhc2NoZW1hLXhtbCI6e3JlcXVpcmVzOlsiZGF0YXNjaGVtYS1iYXNlIl19LGRhdGFzb3VyY2U6e3VzZTpbImRhdGFzb3VyY2UtbG9jYWwiLCJkYXRhc291cmNlLWlvIiwiZGF0YXNvdXJjZS1nZXQiLCJkYXRhc291cmNlLWZ1bmN0aW9uIiwiZGF0YXNvdXJjZS1jYWNoZSIsImRhdGFzb3VyY2UtanNvbnNjaGVtYSIsImRhdGFzb3VyY2UteG1sc2NoZW1hIiwiZGF0YXNvdXJjZS1hcnJheXNjaGVtYSIsImRhdGFzb3VyY2UtdGV4dHNjaGVtYSIsImRhdGFzb3VyY2UtcG9sbGluZyJdfSwiZGF0YXNvdXJjZS1hcnJheXNjaGVtYSI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsInBsdWdpbiIsImRhdGFzY2hlbWEtYXJyYXkiXX0sImRhdGFzb3VyY2UtY2FjaGUiOntyZXF1aXJlczpbImRhdGFzb3VyY2UtbG9jYWwiLCJwbHVnaW4iLCJjYWNoZS1iYXNlIl19LCJkYXRhc291cmNlLWZ1bmN0aW9uIjp7cmVxdWlyZXM6WyJkYXRhc291cmNlLWxvY2FsIl19LCJkYXRhc291cmNlLWdldCI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsImdldCJdfSwiZGF0YXNvdXJjZS1pbyI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsImlvLWJhc2UiXX0sImRhdGFzb3VyY2UtanNvbnNjaGVtYSI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsInBsdWdpbiIsImRhdGFzY2hlbWEtanNvbiJdfSwiZGF0YXNvdXJjZS1sb2NhbCI6e3JlcXVpcmVzOlsiYmFzZSJdfSwiZGF0YXNvdXJjZS1wb2xsaW5nIjp7cmVxdWlyZXM6WyJkYXRhc291cmNlLWxvY2FsIl19LCJkYXRhc291cmNlLXRleHRzY2hlbWEiOntyZXF1aXJlczpbImRhdGFzb3VyY2UtbG9jYWwiLCJwbHVnaW4iLCJkYXRhc2NoZW1hLXRleHQiXX0sImRhdGFzb3VyY2UteG1sc2NoZW1hIjp7cmVxdWlyZXM6WyJkYXRhc291cmNlLWxvY2FsIiwicGx1Z2luIiwiZGF0YXR5cGUteG1sIiwiZGF0YXNjaGVtYS14bWwiXX0sZGF0YXRhYmxlOnt1c2U6WyJkYXRhdGFibGUtY29yZSIsImRhdGF0YWJsZS10YWJsZSIsImRhdGF0YWJsZS1oZWFkIiwiZGF0YXRhYmxlLWJvZHkiLCJkYXRhdGFibGUtYmFzZSIsImRhdGF0YWJsZS1jb2x1bW4td2lkdGhzIiwiZGF0YXRhYmxlLW1lc3NhZ2UiLCJkYXRhdGFibGUtbXV0YWJsZSIsImRhdGF0YWJsZS1zb3J0IiwiZGF0YXRhYmxlLWRhdGFzb3VyY2UiXX0sImRhdGF0YWJsZS1iYXNlIjp7cmVxdWlyZXM6WyJkYXRhdGFibGUtY29yZSIsImRhdGF0YWJsZS10YWJsZSIsImRhdGF0YWJsZS1oZWFkIiwiZGF0YXRhYmxlLWJvZHkiLCJiYXNlLWJ1aWxkIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwiZGF0YXRhYmxlLWJvZHkiOntyZXF1aXJlczpbImRhdGF0YWJsZS1jb3JlIiwidmlldyIsImNsYXNzbmFtZW1hbmFnZXIiXX0sImRhdGF0YWJsZS1jb2x1bW4td2lkdGhzIjp7cmVxdWlyZXM6WyJkYXRhdGFibGUtYmFzZSJdfSwiZGF0YXRhYmxlLWNvcmUiOntyZXF1aXJlczpbImVzY2FwZSIsIm1vZGVsLWxpc3QiLCJub2RlLWV2ZW50LWRlbGVnYXRlIl19LCJkYXRhdGFibGUtZGF0YXNvdXJjZSI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiLCJwbHVnaW4iLCJkYXRhc291cmNlLWxvY2FsIl19LCJkYXRhdGFibGUtZm9vdCI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWNvcmUiLCJ2aWV3Il19LCJkYXRhdGFibGUtZm9ybWF0dGVycyI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJvZHkiLCJkYXRhdHlwZS1udW1iZXItZm9ybWF0IiwiZGF0YXR5cGUtZGF0ZS1mb3JtYXQiLCJlc2NhcGUiXX0sImRhdGF0YWJsZS1oZWFkIjp7cmVxdWlyZXM6WyJkYXRhdGFibGUtY29yZSIsInZpZXciLCJjbGFzc25hbWVtYW5hZ2VyIl19LCJkYXRhdGFibGUtaGlnaGxpZ2h0Ijp7cmVxdWlyZXM6WyJkYXRhdGFibGUtYmFzZSIsImV2ZW50LWhvdmVyIl0sc2tpbm5hYmxlOiEwfSwiZGF0YXRhYmxlLWtleW5hdiI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiXX0sImRhdGF0YWJsZS1tZXNzYWdlIjp7bGFuZzpbImVuIiwiZnIiLCJlcyIsImh1IiwiaXQiXSxyZXF1aXJlczpbImRhdGF0YWJsZS1iYXNlIl0sc2tpbm5hYmxlOiEwfSwiZGF0YXRhYmxlLW11dGFibGUiOntyZXF1aXJlczpbImRhdGF0YWJsZS1iYXNlIl19LCJkYXRhdGFibGUtcGFnaW5hdG9yIjp7bGFuZzpbImVuIiwiZnIiXSxyZXF1aXJlczpbIm1vZGVsIiwidmlldyIsInBhZ2luYXRvci1jb3JlIiwiZGF0YXRhYmxlLWZvb3QiLCJkYXRhdGFibGUtcGFnaW5hdG9yLXRlbXBsYXRlcyJdLHNraW5uYWJsZTohMH0sImRhdGF0YWJsZS1wYWdpbmF0b3ItdGVtcGxhdGVzIjp7cmVxdWlyZXM6WyJ0ZW1wbGF0ZSJdfSwiZGF0YXRhYmxlLXNjcm9sbCI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiLCJkYXRhdGFibGUtY29sdW1uLXdpZHRocyIsImRvbS1zY3JlZW4iXSxza2lubmFibGU6ITB9LCJkYXRhdGFibGUtc29ydCI6e2xhbmc6WyJlbiIsImZyIiwiZXMiLCJodSJdLHJlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiXSxza2lubmFibGU6ITB9LCJkYXRhdGFibGUtdGFibGUiOntyZXF1aXJlczpbImRhdGF0YWJsZS1jb3JlIiwiZGF0YXRhYmxlLWhlYWQiLCJkYXRhdGFibGUtYm9keSIsInZpZXciLCJjbGFzc25hbWVtYW5hZ2VyIl19LGRhdGF0eXBlOnt1c2U6WyJkYXRhdHlwZS1kYXRlIiwiZGF0YXR5cGUtbnVtYmVyIiwiZGF0YXR5cGUteG1sIl19LCJkYXRhdHlwZS1kYXRlIjp7dXNlOlsiZGF0YXR5cGUtZGF0ZS1wYXJzZSIsImRhdGF0eXBlLWRhdGUtZm9ybWF0IiwiZGF0YXR5cGUtZGF0ZS1tYXRoIl19LCJkYXRhdHlwZS1kYXRlLWZvcm1hdCI6e2xhbmc6WyJhciIsImFyLUpPIiwiY2EiLCJjYS1FUyIsImRhIiwiZGEtREsiLCJkZSIsImRlLUFUIiwiZGUtREUiLCJlbCIsImVsLUdSIiwiZW4iLCJlbi1BVSIsImVuLUNBIiwiZW4tR0IiLCJlbi1JRSIsImVuLUlOIiwiZW4tSk8iLCJlbi1NWSIsImVuLU5aIiwiZW4tUEgiLCJlbi1TRyIsImVuLVVTIiwiZXMiLCJlcy1BUiIsImVzLUJPIiwiZXMtQ0wiLCJlcy1DTyIsImVzLUVDIiwiZXMtRVMiLCJlcy1NWCIsImVzLVBFIiwiZXMtUFkiLCJlcy1VUyIsImVzLVVZIiwiZXMtVkUiLCJmaSIsImZpLUZJIiwiZnIiLCJmci1CRSIsImZyLUNBIiwiZnItRlIiLCJoaSIsImhpLUlOIiwiaHUiLCJpZCIsImlkLUlEIiwiaXQiLCJpdC1JVCIsImphIiwiamEtSlAiLCJrbyIsImtvLUtSIiwibXMiLCJtcy1NWSIsIm5iIiwibmItTk8iLCJubCIsIm5sLUJFIiwibmwtTkwiLCJwbCIsInBsLVBMIiwicHQiLCJwdC1CUiIsInJvIiwicm8tUk8iLCJydSIsInJ1LVJVIiwic3YiLCJzdi1TRSIsInRoIiwidGgtVEgiLCJ0ciIsInRyLVRSIiwidmkiLCJ2aS1WTiIsInpoLUhhbnMiLCJ6aC1IYW5zLUNOIiwiemgtSGFudCIsInpoLUhhbnQtSEsiLCJ6aC1IYW50LVRXIl19LCJkYXRhdHlwZS1kYXRlLW1hdGgiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJkYXRhdHlwZS1kYXRlLXBhcnNlIjp7fSwiZGF0YXR5cGUtbnVtYmVyIjp7dXNlOlsiZGF0YXR5cGUtbnVtYmVyLXBhcnNlIiwiZGF0YXR5cGUtbnVtYmVyLWZvcm1hdCJdfSwiZGF0YXR5cGUtbnVtYmVyLWZvcm1hdCI6e30sImRhdGF0eXBlLW51bWJlci1wYXJzZSI6e3JlcXVpcmVzOlsiZXNjYXBlIl19LCJkYXRhdHlwZS14bWwiOnt1c2U6WyJkYXRhdHlwZS14bWwtcGFyc2UiLCJkYXRhdHlwZS14bWwtZm9ybWF0Il19LCJkYXRhdHlwZS14bWwtZm9ybWF0Ijp7fSwiZGF0YXR5cGUteG1sLXBhcnNlIjp7fSxkZDp7dXNlOlsiZGQtZGRtLWJhc2UiLCJkZC1kZG0iLCJkZC1kZG0tZHJvcCIsImRkLWRyYWciLCJkZC1wcm94eSIsImRkLWNvbnN0cmFpbiIsImRkLWRyb3AiLCJkZC1zY3JvbGwiLCJkZC1kZWxlZ2F0ZSJdfSwiZGQtY29uc3RyYWluIjp7cmVxdWlyZXM6WyJkZC1kcmFnIl19LCJkZC1kZG0iOntyZXF1aXJlczpbImRkLWRkbS1iYXNlIiwiZXZlbnQtcmVzaXplIl19LCJkZC1kZG0tYmFzZSI6e3JlcXVpcmVzOlsibm9kZSIsImJhc2UiLCJ5dWktdGhyb3R0bGUiLCJjbGFzc25hbWVtYW5hZ2VyIl19LCJkZC1kZG0tZHJvcCI6e3JlcXVpcmVzOlsiZGQtZGRtIl19LCJkZC1kZWxlZ2F0ZSI6e3JlcXVpcmVzOlsiZGQtZHJhZyIsImRkLWRyb3AtcGx1Z2luIiwiZXZlbnQtbW91c2VlbnRlciJdfSwiZGQtZHJhZyI6e3JlcXVpcmVzOlsiZGQtZGRtLWJhc2UiXX0sImRkLWRyb3AiOntyZXF1aXJlczpbImRkLWRyYWciLCJkZC1kZG0tZHJvcCJdfSwiZGQtZHJvcC1wbHVnaW4iOntyZXF1aXJlczpbImRkLWRyb3AiXX0sImRkLWdlc3R1cmVzIjp7Y29uZGl0aW9uOntuYW1lOiJkZC1nZXN0dXJlcyIsdHJpZ2dlcjoiZGQtZHJhZyIsdWE6InRvdWNoRW5hYmxlZCJ9LHJlcXVpcmVzOlsiZGQtZHJhZyIsImV2ZW50LXN5bnRoZXRpYyIsImV2ZW50LWdlc3R1cmVzIl19LCJkZC1wbHVnaW4iOntvcHRpb25hbDpbImRkLWNvbnN0cmFpbiIsImRkLXByb3h5Il0scmVxdWlyZXM6WyJkZC1kcmFnIl19LCJkZC1wcm94eSI6e3JlcXVpcmVzOlsiZGQtZHJhZyJdfSwiZGQtc2Nyb2xsIjp7cmVxdWlyZXM6WyJkZC1kcmFnIl19LGRpYWw6e2xhbmc6WyJlbiIsImVzIiwiaHUiXSxyZXF1aXJlczpbIndpZGdldCIsImRkLWRyYWciLCJldmVudC1tb3VzZWVudGVyIiwiZXZlbnQtbW92ZSIsImV2ZW50LWtleSIsInRyYW5zaXRpb24iLCJpbnRsIl0sc2tpbm5hYmxlOiEwfSxkb206e3VzZTpbImRvbS1iYXNlIiwiZG9tLXNjcmVlbiIsImRvbS1zdHlsZSIsInNlbGVjdG9yLW5hdGl2ZSIsInNlbGVjdG9yIl19LCJkb20tYmFzZSI6e3JlcXVpcmVzOlsiZG9tLWNvcmUiXX0sImRvbS1jb3JlIjp7cmVxdWlyZXM6WyJvb3AiLCJmZWF0dXJlcyJdfSwiZG9tLXNjcmVlbiI6e3JlcXVpcmVzOlsiZG9tLWJhc2UiLCJkb20tc3R5bGUiXX0sImRvbS1zdHlsZSI6e3JlcXVpcmVzOlsiZG9tLWJhc2UiXX0sImRvbS1zdHlsZS1pZSI6e2NvbmRpdGlvbjp7bmFtZToiZG9tLXN0eWxlLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuRmVhdHVyZXMudGVzdCxuPWUuRmVhdHVyZXMuYWRkLHI9ZS5jb25maWcud2luLGk9ZS5jb25maWcuZG9jLHM9ImRvY3VtZW50RWxlbWVudCIsbz0hMTtyZXR1cm4gbigic3R5bGUiLCJjb21wdXRlZFN0eWxlIix7dGVzdDpmdW5jdGlvbigpe3JldHVybiByJiYiZ2V0Q29tcHV0ZWRTdHlsZSJpbiByfX0pCixuKCJzdHlsZSIsIm9wYWNpdHkiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIGkmJiJvcGFjaXR5ImluIGlbc10uc3R5bGV9fSksbz0hdCgic3R5bGUiLCJvcGFjaXR5IikmJiF0KCJzdHlsZSIsImNvbXB1dGVkU3R5bGUiKSxvfSx0cmlnZ2VyOiJkb20tc3R5bGUifSxyZXF1aXJlczpbImRvbS1zdHlsZSIsImNvbG9yLWJhc2UiXX0sZHVtcDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxlZGl0b3I6e3VzZTpbImZyYW1lIiwiZWRpdG9yLXNlbGVjdGlvbiIsImV4ZWMtY29tbWFuZCIsImVkaXRvci1iYXNlIiwiZWRpdG9yLXBhcmEiLCJlZGl0b3ItYnIiLCJlZGl0b3ItYmlkaSIsImVkaXRvci10YWIiLCJjcmVhdGVsaW5rLWJhc2UiXX0sImVkaXRvci1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIiwiZnJhbWUiLCJub2RlIiwiZXhlYy1jb21tYW5kIiwiZWRpdG9yLXNlbGVjdGlvbiJdfSwiZWRpdG9yLWJpZGkiOntyZXF1aXJlczpbImVkaXRvci1iYXNlIl19LCJlZGl0b3ItYnIiOntyZXF1aXJlczpbImVkaXRvci1iYXNlIl19LCJlZGl0b3ItaW5saW5lIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSIsImNvbnRlbnQtZWRpdGFibGUiXX0sImVkaXRvci1saXN0cyI6e3JlcXVpcmVzOlsiZWRpdG9yLWJhc2UiXX0sImVkaXRvci1wYXJhIjp7cmVxdWlyZXM6WyJlZGl0b3ItcGFyYS1iYXNlIl19LCJlZGl0b3ItcGFyYS1iYXNlIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSJdfSwiZWRpdG9yLXBhcmEtaWUiOntjb25kaXRpb246e25hbWU6ImVkaXRvci1wYXJhLWllIix0cmlnZ2VyOiJlZGl0b3ItcGFyYSIsdWE6ImllIix3aGVuOiJpbnN0ZWFkIn0scmVxdWlyZXM6WyJlZGl0b3ItcGFyYS1iYXNlIl19LCJlZGl0b3Itc2VsZWN0aW9uIjp7cmVxdWlyZXM6WyJub2RlIl19LCJlZGl0b3ItdGFiIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSJdfSxlc2NhcGU6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sZXZlbnQ6e2FmdGVyOlsibm9kZS1iYXNlIl0sdXNlOlsiZXZlbnQtYmFzZSIsImV2ZW50LWRlbGVnYXRlIiwiZXZlbnQtc3ludGhldGljIiwiZXZlbnQtbW91c2V3aGVlbCIsImV2ZW50LW1vdXNlZW50ZXIiLCJldmVudC1rZXkiLCJldmVudC1mb2N1cyIsImV2ZW50LXJlc2l6ZSIsImV2ZW50LWhvdmVyIiwiZXZlbnQtb3V0c2lkZSIsImV2ZW50LXRvdWNoIiwiZXZlbnQtbW92ZSIsImV2ZW50LWZsaWNrIiwiZXZlbnQtdmFsdWVjaGFuZ2UiLCJldmVudC10YXAiXX0sImV2ZW50LWJhc2UiOnthZnRlcjpbIm5vZGUtYmFzZSJdLHJlcXVpcmVzOlsiZXZlbnQtY3VzdG9tLWJhc2UiXX0sImV2ZW50LWJhc2UtaWUiOnthZnRlcjpbImV2ZW50LWJhc2UiXSxjb25kaXRpb246e25hbWU6ImV2ZW50LWJhc2UtaWUiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jJiZlLmNvbmZpZy5kb2MuaW1wbGVtZW50YXRpb247cmV0dXJuIHQmJiF0Lmhhc0ZlYXR1cmUoIkV2ZW50cyIsIjIuMCIpfSx0cmlnZ2VyOiJub2RlLWJhc2UifSxyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtY29udGV4dG1lbnUiOntyZXF1aXJlczpbImV2ZW50LXN5bnRoZXRpYyIsImRvbS1zY3JlZW4iXX0sImV2ZW50LWN1c3RvbSI6e3VzZTpbImV2ZW50LWN1c3RvbS1iYXNlIiwiZXZlbnQtY3VzdG9tLWNvbXBsZXgiXX0sImV2ZW50LWN1c3RvbS1iYXNlIjp7cmVxdWlyZXM6WyJvb3AiXX0sImV2ZW50LWN1c3RvbS1jb21wbGV4Ijp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSJdfSwiZXZlbnQtZGVsZWdhdGUiOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtZmxpY2siOntyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LXRvdWNoIiwiZXZlbnQtc3ludGhldGljIl19LCJldmVudC1mb2N1cyI6e3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19LCJldmVudC1nZXN0dXJlcyI6e3VzZTpbImV2ZW50LWZsaWNrIiwiZXZlbnQtbW92ZSJdfSwiZXZlbnQtaG92ZXIiOntyZXF1aXJlczpbImV2ZW50LW1vdXNlZW50ZXIiXX0sImV2ZW50LWtleSI6e3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19LCJldmVudC1tb3VzZWVudGVyIjp7cmVxdWlyZXM6WyJldmVudC1zeW50aGV0aWMiXX0sImV2ZW50LW1vdXNld2hlZWwiOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtbW92ZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZXZlbnQtdG91Y2giLCJldmVudC1zeW50aGV0aWMiXX0sImV2ZW50LW91dHNpZGUiOntyZXF1aXJlczpbImV2ZW50LXN5bnRoZXRpYyJdfSwiZXZlbnQtcmVzaXplIjp7cmVxdWlyZXM6WyJub2RlLWJhc2UiLCJldmVudC1zeW50aGV0aWMiXX0sImV2ZW50LXNpbXVsYXRlIjp7cmVxdWlyZXM6WyJldmVudC1iYXNlIl19LCJldmVudC1zeW50aGV0aWMiOntyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWN1c3RvbS1jb21wbGV4Il19LCJldmVudC10YXAiOntyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWJhc2UiLCJldmVudC10b3VjaCIsImV2ZW50LXN5bnRoZXRpYyJdfSwiZXZlbnQtdG91Y2giOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtdmFsdWVjaGFuZ2UiOntyZXF1aXJlczpbImV2ZW50LWZvY3VzIiwiZXZlbnQtc3ludGhldGljIl19LCJleGVjLWNvbW1hbmQiOntyZXF1aXJlczpbImZyYW1lIl19LGZlYXR1cmVzOntyZXF1aXJlczpbInl1aS1iYXNlIl19LGZpbGU6e3JlcXVpcmVzOlsiZmlsZS1mbGFzaCIsImZpbGUtaHRtbDUiXX0sImZpbGUtZmxhc2giOntyZXF1aXJlczpbImJhc2UiXX0sImZpbGUtaHRtbDUiOntyZXF1aXJlczpbImJhc2UiXX0sZnJhbWU6e3JlcXVpcmVzOlsiYmFzZSIsIm5vZGUiLCJwbHVnaW4iLCJzZWxlY3Rvci1jc3MzIiwieXVpLXRocm90dGxlIl19LCJnZXN0dXJlLXNpbXVsYXRlIjp7cmVxdWlyZXM6WyJhc3luYy1xdWV1ZSIsImV2ZW50LXNpbXVsYXRlIiwibm9kZS1zY3JlZW4iXX0sZ2V0OntyZXF1aXJlczpbInl1aS1iYXNlIl19LGdyYXBoaWNzOntyZXF1aXJlczpbIm5vZGUiLCJldmVudC1jdXN0b20iLCJwbHVnaW5ob3N0IiwibWF0cml4IiwiY2xhc3NuYW1lbWFuYWdlciJdfSwiZ3JhcGhpY3MtY2FudmFzIjp7Y29uZGl0aW9uOntuYW1lOiJncmFwaGljcy1jYW52YXMiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49ZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmUmJmUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lPT0iY2FudmFzIixyPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT10JiZ0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKTtyZXR1cm4oIWl8fG4pJiZyJiZyLmdldENvbnRleHQmJnIuZ2V0Q29udGV4dCgiMmQiKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSxyZXF1aXJlczpbImdyYXBoaWNzIiwiY29sb3ItYmFzZSJdfSwiZ3JhcGhpY3MtY2FudmFzLWRlZmF1bHQiOntjb25kaXRpb246e25hbWU6ImdyYXBoaWNzLWNhbnZhcy1kZWZhdWx0Iix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lJiZlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZT09ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuKCFpfHxuKSYmciYmci5nZXRDb250ZXh0JiZyLmdldENvbnRleHQoIjJkIil9LHRyaWdnZXI6ImdyYXBoaWNzIn19LCJncmFwaGljcy1ncm91cCI6e3JlcXVpcmVzOlsiZ3JhcGhpY3MiXX0sImdyYXBoaWNzLXN2ZyI6e2NvbmRpdGlvbjp7bmFtZToiZ3JhcGhpY3Mtc3ZnIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPSFlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZXx8ZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmUhPSJjYW52YXMiLHI9dCYmdC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxpPXQmJnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNCYXNpY1N0cnVjdHVyZSIsIjEuMSIpO3JldHVybiBpJiYobnx8IXIpfSx0cmlnZ2VyOiJncmFwaGljcyJ9LHJlcXVpcmVzOlsiZ3JhcGhpY3MiXX0sImdyYXBoaWNzLXN2Zy1kZWZhdWx0Ijp7Y29uZGl0aW9uOntuYW1lOiJncmFwaGljcy1zdmctZGVmYXVsdCIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj0hZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmV8fGUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lIT0iY2FudmFzIixyPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT10JiZ0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKTtyZXR1cm4gaSYmKG58fCFyKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifX0sImdyYXBoaWNzLXZtbCI6e2NvbmRpdGlvbjp7bmFtZToiZ3JhcGhpY3Mtdm1sIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJuIHQmJiF0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKSYmKCFufHwhbi5nZXRDb250ZXh0fHwhbi5nZXRDb250ZXh0KCIyZCIpKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSxyZXF1aXJlczpbImdyYXBoaWNzIiwiY29sb3ItYmFzZSJdfSwiZ3JhcGhpY3Mtdm1sLWRlZmF1bHQiOntjb25kaXRpb246e25hbWU6ImdyYXBoaWNzLXZtbC1kZWZhdWx0Iix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJuIHQmJiF0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKSYmKCFufHwhbi5nZXRDb250ZXh0fHwhbi5nZXRDb250ZXh0KCIyZCIpKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifX0saGFuZGxlYmFyczp7dXNlOlsiaGFuZGxlYmFycy1jb21waWxlciJdfSwiaGFuZGxlYmFycy1iYXNlIjp7cmVxdWlyZXM6W119LCJoYW5kbGViYXJzLWNvbXBpbGVyIjp7cmVxdWlyZXM6WyJoYW5kbGViYXJzLWJhc2UiXX0saGlnaGxpZ2h0Ont1c2U6WyJoaWdobGlnaHQtYmFzZSIsImhpZ2hsaWdodC1hY2NlbnRmb2xkIl19LCJoaWdobGlnaHQtYWNjZW50Zm9sZCI6e3JlcXVpcmVzOlsiaGlnaGxpZ2h0LWJhc2UiLCJ0ZXh0LWFjY2VudGZvbGQiXX0sImhpZ2hsaWdodC1iYXNlIjp7cmVxdWlyZXM6WyJhcnJheS1leHRyYXMiLCJjbGFzc25hbWVtYW5hZ2VyIiwiZXNjYXBlIiwidGV4dC13b3JkYnJlYWsiXX0saGlzdG9yeTp7dXNlOlsiaGlzdG9yeS1iYXNlIiwiaGlzdG9yeS1oYXNoIiwiaGlzdG9yeS1odG1sNSJdfSwiaGlzdG9yeS1iYXNlIjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tY29tcGxleCJdfSwiaGlzdG9yeS1oYXNoIjp7YWZ0ZXI6WyJoaXN0b3J5LWh0bWw1Il0scmVxdWlyZXM6WyJldmVudC1zeW50aGV0aWMiLCJoaXN0b3J5LWJhc2UiLCJ5dWktbGF0ZXIiXX0sImhpc3RvcnktaGFzaC1pZSI6e2NvbmRpdGlvbjp7bmFtZToiaGlzdG9yeS1oYXNoLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmRvY3VtZW50TW9kZTtyZXR1cm4gZS5VQS5pZSYmKCEoIm9uaGFzaGNoYW5nZSJpbiBlLmNvbmZpZy53aW4pfHwhdHx8dDw4KX0sdHJpZ2dlcjoiaGlzdG9yeS1oYXNoIn0scmVxdWlyZXM6WyJoaXN0b3J5LWhhc2giLCJub2RlLWJhc2UiXX0sImhpc3RvcnktaHRtbDUiOntvcHRpb25hbDpbImpzb24iXSxyZXF1aXJlczpbImV2ZW50LWJhc2UiLCJoaXN0b3J5LWJhc2UiLCJub2RlLWJhc2UiCl19LGltYWdlbG9hZGVyOntyZXF1aXJlczpbImJhc2UtYmFzZSIsIm5vZGUtc3R5bGUiLCJub2RlLXNjcmVlbiJdfSxpbnRsOntyZXF1aXJlczpbImludGwtYmFzZSIsImV2ZW50LWN1c3RvbSJdfSwiaW50bC1iYXNlIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxpbzp7dXNlOlsiaW8tYmFzZSIsImlvLXhkciIsImlvLWZvcm0iLCJpby11cGxvYWQtaWZyYW1lIiwiaW8tcXVldWUiXX0sImlvLWJhc2UiOntyZXF1aXJlczpbImV2ZW50LWN1c3RvbS1iYXNlIiwicXVlcnlzdHJpbmctc3RyaW5naWZ5LXNpbXBsZSJdfSwiaW8tZm9ybSI6e3JlcXVpcmVzOlsiaW8tYmFzZSIsIm5vZGUtYmFzZSJdfSwiaW8tbm9kZWpzIjp7Y29uZGl0aW9uOntuYW1lOiJpby1ub2RlanMiLHRyaWdnZXI6ImlvLWJhc2UiLHVhOiJub2RlanMifSxyZXF1aXJlczpbImlvLWJhc2UiXX0sImlvLXF1ZXVlIjp7cmVxdWlyZXM6WyJpby1iYXNlIiwicXVldWUtcHJvbW90ZSJdfSwiaW8tdXBsb2FkLWlmcmFtZSI6e3JlcXVpcmVzOlsiaW8tYmFzZSIsIm5vZGUtYmFzZSJdfSwiaW8teGRyIjp7cmVxdWlyZXM6WyJpby1iYXNlIiwiZGF0YXR5cGUteG1sLXBhcnNlIl19LGpzb246e3VzZTpbImpzb24tcGFyc2UiLCJqc29uLXN0cmluZ2lmeSJdfSwianNvbi1wYXJzZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImpzb24tcGFyc2Utc2hpbSI6e2NvbmRpdGlvbjp7bmFtZToianNvbi1wYXJzZS1zaGltIix0ZXN0OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGkoZSx0KXtyZXR1cm4gZT09PSJvayI/ITA6dH12YXIgdD1lLmNvbmZpZy5nbG9iYWwuSlNPTixuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KT09PSJbb2JqZWN0IEpTT05dIiYmdCxyPWUuY29uZmlnLnVzZU5hdGl2ZUpTT05QYXJzZSE9PSExJiYhIW47aWYocil0cnl7cj1uLnBhcnNlKCd7Im9rIjpmYWxzZX0nLGkpLm9rfWNhdGNoKHMpe3I9ITF9cmV0dXJuIXJ9LHRyaWdnZXI6Impzb24tcGFyc2UifSxyZXF1aXJlczpbImpzb24tcGFyc2UiXX0sImpzb24tc3RyaW5naWZ5Ijp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwianNvbi1zdHJpbmdpZnktc2hpbSI6e2NvbmRpdGlvbjp7bmFtZToianNvbi1zdHJpbmdpZnktc2hpbSIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5nbG9iYWwuSlNPTixuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KT09PSJbb2JqZWN0IEpTT05dIiYmdCxyPWUuY29uZmlnLnVzZU5hdGl2ZUpTT05TdHJpbmdpZnkhPT0hMSYmISFuO2lmKHIpdHJ5e3I9IjAiPT09bi5zdHJpbmdpZnkoMCl9Y2F0Y2goaSl7cj0hMX1yZXR1cm4hcn0sdHJpZ2dlcjoianNvbi1zdHJpbmdpZnkifSxyZXF1aXJlczpbImpzb24tc3RyaW5naWZ5Il19LGpzb25wOntyZXF1aXJlczpbImdldCIsIm9vcCJdfSwianNvbnAtdXJsIjp7cmVxdWlyZXM6WyJqc29ucCJdfSwibGF6eS1tb2RlbC1saXN0Ijp7cmVxdWlyZXM6WyJtb2RlbC1saXN0Il19LGxvYWRlcjp7dXNlOlsibG9hZGVyLWJhc2UiLCJsb2FkZXItcm9sbHVwIiwibG9hZGVyLXl1aTMiXX0sImxvYWRlci1iYXNlIjp7cmVxdWlyZXM6WyJnZXQiLCJmZWF0dXJlcyJdfSwibG9hZGVyLXJvbGx1cCI6e3JlcXVpcmVzOlsibG9hZGVyLWJhc2UiXX0sImxvYWRlci15dWkzIjp7cmVxdWlyZXM6WyJsb2FkZXItYmFzZSJdfSxtYXRyaXg6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sbW9kZWw6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsImVzY2FwZSIsImpzb24tcGFyc2UiXX0sIm1vZGVsLWxpc3QiOntyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsImFycmF5LWludm9rZSIsImFycmF5bGlzdCIsImJhc2UtYnVpbGQiLCJlc2NhcGUiLCJqc29uLXBhcnNlIiwibW9kZWwiXX0sIm1vZGVsLXN5bmMtbG9jYWwiOntyZXF1aXJlczpbIm1vZGVsIiwianNvbi1zdHJpbmdpZnkiXX0sIm1vZGVsLXN5bmMtcmVzdCI6e3JlcXVpcmVzOlsibW9kZWwiLCJpby1iYXNlIiwianNvbi1zdHJpbmdpZnkiXX0sbm9kZTp7dXNlOlsibm9kZS1iYXNlIiwibm9kZS1ldmVudC1kZWxlZ2F0ZSIsIm5vZGUtcGx1Z2luaG9zdCIsIm5vZGUtc2NyZWVuIiwibm9kZS1zdHlsZSJdfSwibm9kZS1iYXNlIjp7cmVxdWlyZXM6WyJldmVudC1iYXNlIiwibm9kZS1jb3JlIiwiZG9tLWJhc2UiLCJkb20tc3R5bGUiXX0sIm5vZGUtY29yZSI6e3JlcXVpcmVzOlsiZG9tLWNvcmUiLCJzZWxlY3RvciJdfSwibm9kZS1ldmVudC1kZWxlZ2F0ZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZXZlbnQtZGVsZWdhdGUiXX0sIm5vZGUtZXZlbnQtaHRtbDUiOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwibm9kZS1ldmVudC1zaW11bGF0ZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZXZlbnQtc2ltdWxhdGUiLCJnZXN0dXJlLXNpbXVsYXRlIl19LCJub2RlLWZsaWNrIjp7cmVxdWlyZXM6WyJjbGFzc25hbWVtYW5hZ2VyIiwidHJhbnNpdGlvbiIsImV2ZW50LWZsaWNrIiwicGx1Z2luIl0sc2tpbm5hYmxlOiEwfSwibm9kZS1mb2N1c21hbmFnZXIiOntyZXF1aXJlczpbImF0dHJpYnV0ZSIsIm5vZGUiLCJwbHVnaW4iLCJub2RlLWV2ZW50LXNpbXVsYXRlIiwiZXZlbnQta2V5IiwiZXZlbnQtZm9jdXMiXX0sIm5vZGUtbG9hZCI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiaW8tYmFzZSJdfSwibm9kZS1tZW51bmF2Ijp7cmVxdWlyZXM6WyJub2RlIiwiY2xhc3NuYW1lbWFuYWdlciIsInBsdWdpbiIsIm5vZGUtZm9jdXNtYW5hZ2VyIl0sc2tpbm5hYmxlOiEwfSwibm9kZS1wbHVnaW5ob3N0Ijp7cmVxdWlyZXM6WyJub2RlLWJhc2UiLCJwbHVnaW5ob3N0Il19LCJub2RlLXNjcmVlbiI6e3JlcXVpcmVzOlsiZG9tLXNjcmVlbiIsIm5vZGUtYmFzZSJdfSwibm9kZS1zY3JvbGwtaW5mbyI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiYmFzZS1idWlsZCIsImV2ZW50LXJlc2l6ZSIsIm5vZGUtcGx1Z2luaG9zdCIsInBsdWdpbiIsInNlbGVjdG9yIl19LCJub2RlLXN0eWxlIjp7cmVxdWlyZXM6WyJkb20tc3R5bGUiLCJub2RlLWJhc2UiXX0sb29wOntyZXF1aXJlczpbInl1aS1iYXNlIl19LG92ZXJsYXk6e3JlcXVpcmVzOlsid2lkZ2V0Iiwid2lkZ2V0LXN0ZG1vZCIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1wb3NpdGlvbi1hbGlnbiIsIndpZGdldC1zdGFjayIsIndpZGdldC1wb3NpdGlvbi1jb25zdHJhaW4iXSxza2lubmFibGU6ITB9LHBhZ2luYXRvcjp7cmVxdWlyZXM6WyJwYWdpbmF0b3ItY29yZSJdfSwicGFnaW5hdG9yLWNvcmUiOntyZXF1aXJlczpbImJhc2UiXX0sInBhZ2luYXRvci11cmwiOntyZXF1aXJlczpbInBhZ2luYXRvciJdfSxwYW5lbDp7cmVxdWlyZXM6WyJ3aWRnZXQiLCJ3aWRnZXQtYXV0b2hpZGUiLCJ3aWRnZXQtYnV0dG9ucyIsIndpZGdldC1tb2RhbGl0eSIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1wb3NpdGlvbi1hbGlnbiIsIndpZGdldC1wb3NpdGlvbi1jb25zdHJhaW4iLCJ3aWRnZXQtc3RhY2siLCJ3aWRnZXQtc3RkbW9kIl0sc2tpbm5hYmxlOiEwfSxwYXJhbGxlbDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxwamF4OntyZXF1aXJlczpbInBqYXgtYmFzZSIsInBqYXgtY29udGVudCJdfSwicGpheC1iYXNlIjp7cmVxdWlyZXM6WyJjbGFzc25hbWVtYW5hZ2VyIiwibm9kZS1ldmVudC1kZWxlZ2F0ZSIsInJvdXRlciJdfSwicGpheC1jb250ZW50Ijp7cmVxdWlyZXM6WyJpby1iYXNlIiwibm9kZS1iYXNlIiwicm91dGVyIl19LCJwamF4LXBsdWdpbiI6e3JlcXVpcmVzOlsibm9kZS1wbHVnaW5ob3N0IiwicGpheCIsInBsdWdpbiJdfSxwbHVnaW46e3JlcXVpcmVzOlsiYmFzZS1iYXNlIl19LHBsdWdpbmhvc3Q6e3VzZTpbInBsdWdpbmhvc3QtYmFzZSIsInBsdWdpbmhvc3QtY29uZmlnIl19LCJwbHVnaW5ob3N0LWJhc2UiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJwbHVnaW5ob3N0LWNvbmZpZyI6e3JlcXVpcmVzOlsicGx1Z2luaG9zdC1iYXNlIl19LHByb21pc2U6e3JlcXVpcmVzOlsidGltZXJzIl19LHF1ZXJ5c3RyaW5nOnt1c2U6WyJxdWVyeXN0cmluZy1wYXJzZSIsInF1ZXJ5c3RyaW5nLXN0cmluZ2lmeSJdfSwicXVlcnlzdHJpbmctcGFyc2UiOntyZXF1aXJlczpbInl1aS1iYXNlIiwiYXJyYXktZXh0cmFzIl19LCJxdWVyeXN0cmluZy1wYXJzZS1zaW1wbGUiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJxdWVyeXN0cmluZy1zdHJpbmdpZnkiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJxdWVyeXN0cmluZy1zdHJpbmdpZnktc2ltcGxlIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwicXVldWUtcHJvbW90ZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sInJhbmdlLXNsaWRlciI6e3JlcXVpcmVzOlsic2xpZGVyLWJhc2UiLCJzbGlkZXItdmFsdWUtcmFuZ2UiLCJjbGlja2FibGUtcmFpbCJdfSxyZWNvcmRzZXQ6e3VzZTpbInJlY29yZHNldC1iYXNlIiwicmVjb3Jkc2V0LXNvcnQiLCJyZWNvcmRzZXQtZmlsdGVyIiwicmVjb3Jkc2V0LWluZGV4ZXIiXX0sInJlY29yZHNldC1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIiwiYXJyYXlsaXN0Il19LCJyZWNvcmRzZXQtZmlsdGVyIjp7cmVxdWlyZXM6WyJyZWNvcmRzZXQtYmFzZSIsImFycmF5LWV4dHJhcyIsInBsdWdpbiJdfSwicmVjb3Jkc2V0LWluZGV4ZXIiOntyZXF1aXJlczpbInJlY29yZHNldC1iYXNlIiwicGx1Z2luIl19LCJyZWNvcmRzZXQtc29ydCI6e3JlcXVpcmVzOlsiYXJyYXlzb3J0IiwicmVjb3Jkc2V0LWJhc2UiLCJwbHVnaW4iXX0scmVzaXplOnt1c2U6WyJyZXNpemUtYmFzZSIsInJlc2l6ZS1wcm94eSIsInJlc2l6ZS1jb25zdHJhaW4iXX0sInJlc2l6ZS1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIiwid2lkZ2V0IiwiZXZlbnQiLCJvb3AiLCJkZC1kcmFnIiwiZGQtZGVsZWdhdGUiLCJkZC1kcm9wIl0sc2tpbm5hYmxlOiEwfSwicmVzaXplLWNvbnN0cmFpbiI6e3JlcXVpcmVzOlsicGx1Z2luIiwicmVzaXplLWJhc2UiXX0sInJlc2l6ZS1wbHVnaW4iOntvcHRpb25hbDpbInJlc2l6ZS1jb25zdHJhaW4iXSxyZXF1aXJlczpbInJlc2l6ZS1iYXNlIiwicGx1Z2luIl19LCJyZXNpemUtcHJveHkiOntyZXF1aXJlczpbInBsdWdpbiIsInJlc2l6ZS1iYXNlIl19LHJvdXRlcjp7b3B0aW9uYWw6WyJxdWVyeXN0cmluZy1wYXJzZSJdLHJlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiYmFzZS1idWlsZCIsImhpc3RvcnkiXX0sc2Nyb2xsdmlldzp7cmVxdWlyZXM6WyJzY3JvbGx2aWV3LWJhc2UiLCJzY3JvbGx2aWV3LXNjcm9sbGJhcnMiXX0sInNjcm9sbHZpZXctYmFzZSI6e3JlcXVpcmVzOlsid2lkZ2V0IiwiZXZlbnQtZ2VzdHVyZXMiLCJldmVudC1tb3VzZXdoZWVsIiwidHJhbnNpdGlvbiJdLHNraW5uYWJsZTohMH0sInNjcm9sbHZpZXctYmFzZS1pZSI6e2NvbmRpdGlvbjp7bmFtZToic2Nyb2xsdmlldy1iYXNlLWllIix0cmlnZ2VyOiJzY3JvbGx2aWV3LWJhc2UiLHVhOiJpZSJ9LHJlcXVpcmVzOlsic2Nyb2xsdmlldy1iYXNlIl19LCJzY3JvbGx2aWV3LWxpc3QiOntyZXF1aXJlczpbInBsdWdpbiIsImNsYXNzbmFtZW1hbmFnZXIiXSxza2lubmFibGU6ITB9LCJzY3JvbGx2aWV3LXBhZ2luYXRvciI6e3JlcXVpcmVzOlsicGx1Z2luIiwiY2xhc3NuYW1lbWFuYWdlciJdfSwic2Nyb2xsdmlldy1zY3JvbGxiYXJzIjp7cmVxdWlyZXM6WyJjbGFzc25hbWVtYW5hZ2VyIiwidHJhbnNpdGlvbiIsInBsdWdpbiJdLHNraW5uYWJsZTohMH0sc2VsZWN0b3I6e3JlcXVpcmVzOlsic2VsZWN0b3ItbmF0aXZlIl19LCJzZWxlY3Rvci1jc3MyIjp7Y29uZGl0aW9uOntuYW1lOiJzZWxlY3Rvci1jc3MyIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJiEoInF1ZXJ5U2VsZWN0b3JBbGwiaW4gdCk7cmV0dXJuIG59LHRyaWdnZXI6InNlbGVjdG9yIn0scmVxdWlyZXM6WyJzZWxlY3Rvci1uYXRpdmUiXX0sInNlbGVjdG9yLWNzczMiOntyZXF1aXJlczpbInNlbGVjdG9yLW5hdGl2ZSIsInNlbGVjdG9yLWNzczIiXX0sInNlbGVjdG9yLW5hdGl2ZSI6e3JlcXVpcmVzOlsiZG9tLWJhc2UiXX0sInNlcmllcy1hcmVhIgo6e3JlcXVpcmVzOlsic2VyaWVzLWNhcnRlc2lhbiIsInNlcmllcy1maWxsLXV0aWwiXX0sInNlcmllcy1hcmVhLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLWFyZWEiXX0sInNlcmllcy1hcmVhc3BsaW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtYXJlYSIsInNlcmllcy1jdXJ2ZS11dGlsIl19LCJzZXJpZXMtYXJlYXNwbGluZS1zdGFja2VkIjp7cmVxdWlyZXM6WyJzZXJpZXMtc3RhY2tlZCIsInNlcmllcy1hcmVhc3BsaW5lIl19LCJzZXJpZXMtYmFyIjp7cmVxdWlyZXM6WyJzZXJpZXMtbWFya2VyIiwic2VyaWVzLWhpc3RvZ3JhbS1iYXNlIl19LCJzZXJpZXMtYmFyLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLWJhciJdfSwic2VyaWVzLWJhc2UiOntyZXF1aXJlczpbImdyYXBoaWNzIiwiYXhpcy1iYXNlIl19LCJzZXJpZXMtY2FuZGxlc3RpY2siOntyZXF1aXJlczpbInNlcmllcy1yYW5nZSJdfSwic2VyaWVzLWNhcnRlc2lhbiI6e3JlcXVpcmVzOlsic2VyaWVzLWJhc2UiXX0sInNlcmllcy1jb2x1bW4iOntyZXF1aXJlczpbInNlcmllcy1tYXJrZXIiLCJzZXJpZXMtaGlzdG9ncmFtLWJhc2UiXX0sInNlcmllcy1jb2x1bW4tc3RhY2tlZCI6e3JlcXVpcmVzOlsic2VyaWVzLXN0YWNrZWQiLCJzZXJpZXMtY29sdW1uIl19LCJzZXJpZXMtY29tYm8iOntyZXF1aXJlczpbInNlcmllcy1jYXJ0ZXNpYW4iLCJzZXJpZXMtbGluZS11dGlsIiwic2VyaWVzLXBsb3QtdXRpbCIsInNlcmllcy1maWxsLXV0aWwiXX0sInNlcmllcy1jb21iby1zdGFja2VkIjp7cmVxdWlyZXM6WyJzZXJpZXMtc3RhY2tlZCIsInNlcmllcy1jb21ibyJdfSwic2VyaWVzLWNvbWJvc3BsaW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtY29tYm8iLCJzZXJpZXMtY3VydmUtdXRpbCJdfSwic2VyaWVzLWNvbWJvc3BsaW5lLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1jb21iby1zdGFja2VkIiwic2VyaWVzLWN1cnZlLXV0aWwiXX0sInNlcmllcy1jdXJ2ZS11dGlsIjp7fSwic2VyaWVzLWZpbGwtdXRpbCI6e30sInNlcmllcy1oaXN0b2dyYW0tYmFzZSI6e3JlcXVpcmVzOlsic2VyaWVzLWNhcnRlc2lhbiIsInNlcmllcy1wbG90LXV0aWwiXX0sInNlcmllcy1saW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtY2FydGVzaWFuIiwic2VyaWVzLWxpbmUtdXRpbCJdfSwic2VyaWVzLWxpbmUtc3RhY2tlZCI6e3JlcXVpcmVzOlsic2VyaWVzLXN0YWNrZWQiLCJzZXJpZXMtbGluZSJdfSwic2VyaWVzLWxpbmUtdXRpbCI6e30sInNlcmllcy1tYXJrZXIiOntyZXF1aXJlczpbInNlcmllcy1jYXJ0ZXNpYW4iLCJzZXJpZXMtcGxvdC11dGlsIl19LCJzZXJpZXMtbWFya2VyLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLW1hcmtlciJdfSwic2VyaWVzLW9obGMiOntyZXF1aXJlczpbInNlcmllcy1yYW5nZSJdfSwic2VyaWVzLXBpZSI6e3JlcXVpcmVzOlsic2VyaWVzLWJhc2UiLCJzZXJpZXMtcGxvdC11dGlsIl19LCJzZXJpZXMtcGxvdC11dGlsIjp7fSwic2VyaWVzLXJhbmdlIjp7cmVxdWlyZXM6WyJzZXJpZXMtY2FydGVzaWFuIl19LCJzZXJpZXMtc3BsaW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtbGluZSIsInNlcmllcy1jdXJ2ZS11dGlsIl19LCJzZXJpZXMtc3BsaW5lLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLXNwbGluZSJdfSwic2VyaWVzLXN0YWNrZWQiOntyZXF1aXJlczpbImF4aXMtc3RhY2tlZCJdfSwic2hpbS1wbHVnaW4iOntyZXF1aXJlczpbIm5vZGUtc3R5bGUiLCJub2RlLXBsdWdpbmhvc3QiXX0sc2xpZGVyOnt1c2U6WyJzbGlkZXItYmFzZSIsInNsaWRlci12YWx1ZS1yYW5nZSIsImNsaWNrYWJsZS1yYWlsIiwicmFuZ2Utc2xpZGVyIl19LCJzbGlkZXItYmFzZSI6e3JlcXVpcmVzOlsid2lkZ2V0IiwiZGQtY29uc3RyYWluIiwiZXZlbnQta2V5Il0sc2tpbm5hYmxlOiEwfSwic2xpZGVyLXZhbHVlLXJhbmdlIjp7cmVxdWlyZXM6WyJzbGlkZXItYmFzZSJdfSxzb3J0YWJsZTp7cmVxdWlyZXM6WyJkZC1kZWxlZ2F0ZSIsImRkLWRyb3AtcGx1Z2luIiwiZGQtcHJveHkiXX0sInNvcnRhYmxlLXNjcm9sbCI6e3JlcXVpcmVzOlsiZGQtc2Nyb2xsIiwic29ydGFibGUiXX0sc3R5bGVzaGVldDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxzdWJzdGl0dXRlOntvcHRpb25hbDpbImR1bXAiXSxyZXF1aXJlczpbInl1aS1iYXNlIl19LHN3Zjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20iLCJub2RlIiwic3dmZGV0ZWN0IiwiZXNjYXBlIl19LHN3ZmRldGVjdDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSx0YWJ2aWV3OntyZXF1aXJlczpbIndpZGdldCIsIndpZGdldC1wYXJlbnQiLCJ3aWRnZXQtY2hpbGQiLCJ0YWJ2aWV3LWJhc2UiLCJub2RlLXBsdWdpbmhvc3QiLCJub2RlLWZvY3VzbWFuYWdlciJdLHNraW5uYWJsZTohMH0sInRhYnZpZXctYmFzZSI6e3JlcXVpcmVzOlsibm9kZS1ldmVudC1kZWxlZ2F0ZSIsImNsYXNzbmFtZW1hbmFnZXIiXX0sInRhYnZpZXctcGx1Z2luIjp7cmVxdWlyZXM6WyJ0YWJ2aWV3LWJhc2UiXX0sdGVtcGxhdGU6e3VzZTpbInRlbXBsYXRlLWJhc2UiLCJ0ZW1wbGF0ZS1taWNybyJdfSwidGVtcGxhdGUtYmFzZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sInRlbXBsYXRlLW1pY3JvIjp7cmVxdWlyZXM6WyJlc2NhcGUiXX0sdGVzdDp7cmVxdWlyZXM6WyJldmVudC1zaW11bGF0ZSIsImV2ZW50LWN1c3RvbSIsImpzb24tc3RyaW5naWZ5Il19LCJ0ZXN0LWNvbnNvbGUiOntyZXF1aXJlczpbImNvbnNvbGUtZmlsdGVycyIsInRlc3QiLCJhcnJheS1leHRyYXMiXSxza2lubmFibGU6ITB9LHRleHQ6e3VzZTpbInRleHQtYWNjZW50Zm9sZCIsInRleHQtd29yZGJyZWFrIl19LCJ0ZXh0LWFjY2VudGZvbGQiOntyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsInRleHQtZGF0YS1hY2NlbnRmb2xkIl19LCJ0ZXh0LWRhdGEtYWNjZW50Zm9sZCI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sInRleHQtZGF0YS13b3JkYnJlYWsiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJ0ZXh0LXdvcmRicmVhayI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwidGV4dC1kYXRhLXdvcmRicmVhayJdfSx0aW1lcnM6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sdHJhbnNpdGlvbjp7cmVxdWlyZXM6WyJub2RlLXN0eWxlIl19LCJ0cmFuc2l0aW9uLXRpbWVyIjp7Y29uZGl0aW9uOntuYW1lOiJ0cmFuc2l0aW9uLXRpbWVyIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQ/dC5kb2N1bWVudEVsZW1lbnQ6bnVsbCxyPSEwO3JldHVybiBuJiZuLnN0eWxlJiYocj0hKCJNb3pUcmFuc2l0aW9uImluIG4uc3R5bGV8fCJXZWJraXRUcmFuc2l0aW9uImluIG4uc3R5bGV8fCJ0cmFuc2l0aW9uImluIG4uc3R5bGUpKSxyfSx0cmlnZ2VyOiJ0cmFuc2l0aW9uIn0scmVxdWlyZXM6WyJ0cmFuc2l0aW9uIl19LHRyZWU6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsInRyZWUtbm9kZSJdfSwidHJlZS1sYWJlbGFibGUiOntyZXF1aXJlczpbInRyZWUiXX0sInRyZWUtbGF6eSI6e3JlcXVpcmVzOlsiYmFzZS1wbHVnaW5ob3N0IiwicGx1Z2luIiwidHJlZSJdfSwidHJlZS1ub2RlIjp7fSwidHJlZS1vcGVuYWJsZSI6e3JlcXVpcmVzOlsidHJlZSJdfSwidHJlZS1zZWxlY3RhYmxlIjp7cmVxdWlyZXM6WyJ0cmVlIl19LCJ0cmVlLXNvcnRhYmxlIjp7cmVxdWlyZXM6WyJ0cmVlIl19LHVwbG9hZGVyOntyZXF1aXJlczpbInVwbG9hZGVyLWh0bWw1IiwidXBsb2FkZXItZmxhc2giXX0sInVwbG9hZGVyLWZsYXNoIjp7cmVxdWlyZXM6WyJzd2ZkZXRlY3QiLCJlc2NhcGUiLCJ3aWRnZXQiLCJiYXNlIiwiY3NzYnV0dG9uIiwibm9kZSIsImV2ZW50LWN1c3RvbSIsInVwbG9hZGVyLXF1ZXVlIl19LCJ1cGxvYWRlci1odG1sNSI6e3JlcXVpcmVzOlsid2lkZ2V0Iiwibm9kZS1ldmVudC1zaW11bGF0ZSIsImZpbGUtaHRtbDUiLCJ1cGxvYWRlci1xdWV1ZSJdfSwidXBsb2FkZXItcXVldWUiOntyZXF1aXJlczpbImJhc2UiXX0sdmlldzp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwibm9kZS1ldmVudC1kZWxlZ2F0ZSJdfSwidmlldy1ub2RlLW1hcCI6e3JlcXVpcmVzOlsidmlldyJdfSx3aWRnZXQ6e3VzZTpbIndpZGdldC1iYXNlIiwid2lkZ2V0LWh0bWxwYXJzZXIiLCJ3aWRnZXQtc2tpbiIsIndpZGdldC11aWV2ZW50cyJdfSwid2lkZ2V0LWFuaW0iOntyZXF1aXJlczpbImFuaW0tYmFzZSIsInBsdWdpbiIsIndpZGdldCJdfSwid2lkZ2V0LWF1dG9oaWRlIjp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwiZXZlbnQta2V5IiwiZXZlbnQtb3V0c2lkZSIsIndpZGdldCJdfSwid2lkZ2V0LWJhc2UiOntyZXF1aXJlczpbImF0dHJpYnV0ZSIsImJhc2UtYmFzZSIsImJhc2UtcGx1Z2luaG9zdCIsImNsYXNzbmFtZW1hbmFnZXIiLCJldmVudC1mb2N1cyIsIm5vZGUtYmFzZSIsIm5vZGUtc3R5bGUiXSxza2lubmFibGU6ITB9LCJ3aWRnZXQtYmFzZS1pZSI6e2NvbmRpdGlvbjp7bmFtZToid2lkZ2V0LWJhc2UtaWUiLHRyaWdnZXI6IndpZGdldC1iYXNlIix1YToiaWUifSxyZXF1aXJlczpbIndpZGdldC1iYXNlIl19LCJ3aWRnZXQtYnV0dG9ucyI6e3JlcXVpcmVzOlsiYnV0dG9uLXBsdWdpbiIsImNzc2J1dHRvbiIsIndpZGdldC1zdGRtb2QiXX0sIndpZGdldC1jaGlsZCI6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsIndpZGdldCJdfSwid2lkZ2V0LWh0bWxwYXJzZXIiOntyZXF1aXJlczpbIndpZGdldC1iYXNlIl19LCJ3aWRnZXQtbW9kYWxpdHkiOntyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJldmVudC1vdXRzaWRlIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwid2lkZ2V0LXBhcmVudCI6e3JlcXVpcmVzOlsiYXJyYXlsaXN0IiwiYmFzZS1idWlsZCIsIndpZGdldCJdfSwid2lkZ2V0LXBvc2l0aW9uIjp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwibm9kZS1zY3JlZW4iLCJ3aWRnZXQiXX0sIndpZGdldC1wb3NpdGlvbi1hbGlnbiI6e3JlcXVpcmVzOlsid2lkZ2V0LXBvc2l0aW9uIl19LCJ3aWRnZXQtcG9zaXRpb24tY29uc3RyYWluIjp7cmVxdWlyZXM6WyJ3aWRnZXQtcG9zaXRpb24iXX0sIndpZGdldC1za2luIjp7cmVxdWlyZXM6WyJ3aWRnZXQtYmFzZSJdfSwid2lkZ2V0LXN0YWNrIjp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwid2lkZ2V0LXN0ZG1vZCI6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsIndpZGdldCJdfSwid2lkZ2V0LXVpZXZlbnRzIjp7cmVxdWlyZXM6WyJub2RlLWV2ZW50LWRlbGVnYXRlIiwid2lkZ2V0LWJhc2UiXX0seXFsOntyZXF1aXJlczpbIm9vcCJdfSwieXFsLWpzb25wIjp7Y29uZGl0aW9uOntuYW1lOiJ5cWwtanNvbnAiLHRlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIWUuVUEubm9kZWpzJiYhZS5VQS53aW5qc30sdHJpZ2dlcjoieXFsIn0scmVxdWlyZXM6WyJ5cWwiLCJqc29ucCIsImpzb25wLXVybCJdfSwieXFsLW5vZGVqcyI6e2NvbmRpdGlvbjp7bmFtZToieXFsLW5vZGVqcyIsdHJpZ2dlcjoieXFsIix1YToibm9kZWpzIn0scmVxdWlyZXM6WyJ5cWwiXX0sInlxbC13aW5qcyI6e2NvbmRpdGlvbjp7bmFtZToieXFsLXdpbmpzIix0cmlnZ2VyOiJ5cWwiLHVhOiJ3aW5qcyJ9LHJlcXVpcmVzOlsieXFsIl19LHl1aTp7fSwieXVpLWJhc2UiOnt9LCJ5dWktbGF0ZXIiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJ5dWktbG9nIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwieXVpLXRocm90dGxlIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfX0pLFlVSS5FbnZbZS52ZXJzaW9uXS5tZDU9IjQ1MzU3YmIxMWVkZGY3ZmQwYTg5YzBiNzU2NTk5ZGYyIn0sIjMuMTcuMiIse3JlcXVpcmVzOlsibG9hZGVyLWJhc2UiXX0pLFlVSS5hZGQoInl1aSIsZnVuY3Rpb24oZSx0KXt9LCIzLjE3LjIiLHt1c2U6WyJ5dWktYmFzZSIsImdldCIsImZlYXR1cmVzIiwiaW50bC1iYXNlIiwieXVpLWxvZyIsInl1aS1sYXRlciIsImxvYWRlci1iYXNlIiwibG9hZGVyLXJvbGx1cCIKLCJsb2FkZXIteXVpMyJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJvb3AiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gYSh0LG4saSxzLG8pe2lmKHQmJnRbb10mJnQhPT1lKXJldHVybiB0W29dLmNhbGwodCxuLGkpO3N3aXRjaChyLnRlc3QodCkpe2Nhc2UgMTpyZXR1cm4gcltvXSh0LG4saSk7Y2FzZSAyOnJldHVybiByW29dKGUuQXJyYXkodCwwLCEwKSxuLGkpO2RlZmF1bHQ6cmV0dXJuIGUuT2JqZWN0W29dKHQsbixpLHMpfX12YXIgbj1lLkxhbmcscj1lLkFycmF5LGk9T2JqZWN0LnByb3RvdHlwZSxzPSJffnl1aW1+XyIsbz1pLmhhc093blByb3BlcnR5LHU9aS50b1N0cmluZztlLmF1Z21lbnQ9ZnVuY3Rpb24odCxuLHIsaSxzKXt2YXIgYT10LnByb3RvdHlwZSxmPWEmJm4sbD1uLnByb3RvdHlwZSxjPWF8fHQsaCxwLGQsdixtO3JldHVybiBzPXM/ZS5BcnJheShzKTpbXSxmJiYocD17fSxkPXt9LHY9e30saD1mdW5jdGlvbihlLHQpe2lmKHJ8fCEodCBpbiBhKSl1LmNhbGwoZSk9PT0iW29iamVjdCBGdW5jdGlvbl0iPyh2W3RdPWUscFt0XT1kW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIG0odGhpcyxlLGFyZ3VtZW50cyl9KTpwW3RdPWV9LG09ZnVuY3Rpb24oZSx0LHIpe2Zvcih2YXIgaSBpbiB2KW8uY2FsbCh2LGkpJiZlW2ldPT09ZFtpXSYmKGVbaV09dltpXSk7cmV0dXJuIG4uYXBwbHkoZSxzKSx0LmFwcGx5KGUscil9LGk/ZS5BcnJheS5lYWNoKGksZnVuY3Rpb24oZSl7ZSBpbiBsJiZoKGxbZV0sZSl9KTplLk9iamVjdC5lYWNoKGwsaCxudWxsLCEwKSksZS5taXgoYyxwfHxsLHIsaSksZnx8bi5hcHBseShjLHMpLHR9LGUuYWdncmVnYXRlPWZ1bmN0aW9uKHQsbixyLGkpe3JldHVybiBlLm1peCh0LG4scixpLDAsITApfSxlLmV4dGVuZD1mdW5jdGlvbih0LG4scixzKXsoIW58fCF0KSYmZS5lcnJvcigiZXh0ZW5kIGZhaWxlZCwgdmVyaWZ5IGRlcGVuZGVuY2llcyIpO3ZhciBvPW4ucHJvdG90eXBlLHU9ZS5PYmplY3Qobyk7cmV0dXJuIHQucHJvdG90eXBlPXUsdS5jb25zdHJ1Y3Rvcj10LHQuc3VwZXJjbGFzcz1vLG4hPU9iamVjdCYmby5jb25zdHJ1Y3Rvcj09aS5jb25zdHJ1Y3RvciYmKG8uY29uc3RydWN0b3I9biksciYmZS5taXgodSxyLCEwKSxzJiZlLm1peCh0LHMsITApLHR9LGUuZWFjaD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gYShlLHQsbixyLCJlYWNoIil9LGUuc29tZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gYShlLHQsbixyLCJzb21lIil9LGUuY2xvbmU9ZnVuY3Rpb24odCxyLGksbyx1LGEpe3ZhciBmLGwsYztpZighbi5pc09iamVjdCh0KXx8ZS5pbnN0YW5jZU9mKHQsWVVJKXx8dC5hZGRFdmVudExpc3RlbmVyfHx0LmF0dGFjaEV2ZW50KXJldHVybiB0O2w9YXx8e307c3dpdGNoKG4udHlwZSh0KSl7Y2FzZSJkYXRlIjpyZXR1cm4gbmV3IERhdGUodCk7Y2FzZSJyZWdleHAiOnJldHVybiB0O2Nhc2UiZnVuY3Rpb24iOnJldHVybiB0O2Nhc2UiYXJyYXkiOmY9W107YnJlYWs7ZGVmYXVsdDppZih0W3NdKXJldHVybiBsW3Rbc11dO2M9ZS5ndWlkKCksZj1yP3t9OmUuT2JqZWN0KHQpLHRbc109YyxsW2NdPXR9cmV0dXJuIGUuZWFjaCh0LGZ1bmN0aW9uKG4sYSl7KGF8fGE9PT0wKSYmKCFpfHxpLmNhbGwob3x8dGhpcyxuLGEsdGhpcyx0KSE9PSExKSYmYSE9PXMmJmEhPSJwcm90b3R5cGUiJiYodGhpc1thXT1lLmNsb25lKG4scixpLG8sdXx8dCxsKSl9LGYpLGF8fChlLk9iamVjdC5lYWNoKGwsZnVuY3Rpb24oZSx0KXtpZihlW3NdKXRyeXtkZWxldGUgZVtzXX1jYXRjaChuKXtlW3NdPW51bGx9fSx0aGlzKSxsPW51bGwpLGZ9LGUuYmluZD1mdW5jdGlvbih0LHIpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+Mj9lLkFycmF5KGFyZ3VtZW50cywyLCEwKTpudWxsO3JldHVybiBmdW5jdGlvbigpe3ZhciBzPW4uaXNTdHJpbmcodCk/clt0XTp0LG89aT9pLmNvbmNhdChlLkFycmF5KGFyZ3VtZW50cywwLCEwKSk6YXJndW1lbnRzO3JldHVybiBzLmFwcGx5KHJ8fHMsbyl9fSxlLnJiaW5kPWZ1bmN0aW9uKHQscil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yP2UuQXJyYXkoYXJndW1lbnRzLDIsITApOm51bGw7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHM9bi5pc1N0cmluZyh0KT9yW3RdOnQsbz1pP2UuQXJyYXkoYXJndW1lbnRzLDAsITApLmNvbmNhdChpKTphcmd1bWVudHM7cmV0dXJuIHMuYXBwbHkocnx8cyxvKX19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1jdXN0b20tYmFzZSIsZnVuY3Rpb24oZSx0KXtlLkVudi5ldnQ9e2hhbmRsZXM6e30scGx1Z2luczp7fX07dmFyIG49MCxyPTEsaT17b2JqczpudWxsLGJlZm9yZTpmdW5jdGlvbih0LHIsaSxzKXt2YXIgbz10LHU7cmV0dXJuIHMmJih1PVt0LHNdLmNvbmNhdChlLkFycmF5KGFyZ3VtZW50cyw0LCEwKSksbz1lLnJiaW5kLmFwcGx5KGUsdSkpLHRoaXMuX2luamVjdChuLG8scixpKX0sYWZ0ZXI6ZnVuY3Rpb24odCxuLGkscyl7dmFyIG89dCx1O3JldHVybiBzJiYodT1bdCxzXS5jb25jYXQoZS5BcnJheShhcmd1bWVudHMsNCwhMCkpLG89ZS5yYmluZC5hcHBseShlLHUpKSx0aGlzLl9pbmplY3QocixvLG4saSl9LF9pbmplY3Q6ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM9ZS5zdGFtcChyKSxvLHU7cmV0dXJuIHIuX3l1aWFvcHx8KHIuX3l1aWFvcD17fSksbz1yLl95dWlhb3Asb1tpXXx8KG9baV09bmV3IGUuRG8uTWV0aG9kKHIsaSkscltpXT1mdW5jdGlvbigpe3JldHVybiBvW2ldLmV4ZWMuYXBwbHkob1tpXSxhcmd1bWVudHMpfSksdT1zK2Uuc3RhbXAobikraSxvW2ldLnJlZ2lzdGVyKHUsbix0KSxuZXcgZS5FdmVudEhhbmRsZShvW2ldLHUpfSxkZXRhY2g6ZnVuY3Rpb24oZSl7ZS5kZXRhY2gmJmUuZGV0YWNoKCl9fTtlLkRvPWksaS5NZXRob2Q9ZnVuY3Rpb24oZSx0KXt0aGlzLm9iaj1lLHRoaXMubWV0aG9kTmFtZT10LHRoaXMubWV0aG9kPWVbdF0sdGhpcy5iZWZvcmU9e30sdGhpcy5hZnRlcj17fX0saS5NZXRob2QucHJvdG90eXBlLnJlZ2lzdGVyPWZ1bmN0aW9uKGUsdCxuKXtuP3RoaXMuYWZ0ZXJbZV09dDp0aGlzLmJlZm9yZVtlXT10fSxpLk1ldGhvZC5wcm90b3R5cGUuX2RlbGV0ZT1mdW5jdGlvbihlKXtkZWxldGUgdGhpcy5iZWZvcmVbZV0sZGVsZXRlIHRoaXMuYWZ0ZXJbZV19LGkuTWV0aG9kLnByb3RvdHlwZS5leGVjPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5BcnJheShhcmd1bWVudHMsMCwhMCksbixyLHMsbz10aGlzLmJlZm9yZSx1PXRoaXMuYWZ0ZXIsYT0hMTtmb3IobiBpbiBvKWlmKG8uaGFzT3duUHJvcGVydHkobikpe3I9b1tuXS5hcHBseSh0aGlzLm9iaix0KTtpZihyKXN3aXRjaChyLmNvbnN0cnVjdG9yKXtjYXNlIGkuSGFsdDpyZXR1cm4gci5yZXRWYWw7Y2FzZSBpLkFsdGVyQXJnczp0PXIubmV3QXJnczticmVhaztjYXNlIGkuUHJldmVudDphPSEwO2JyZWFrO2RlZmF1bHQ6fX1hfHwocj10aGlzLm1ldGhvZC5hcHBseSh0aGlzLm9iaix0KSksaS5vcmlnaW5hbFJldFZhbD1yLGkuY3VycmVudFJldFZhbD1yO2ZvcihuIGluIHUpaWYodS5oYXNPd25Qcm9wZXJ0eShuKSl7cz11W25dLmFwcGx5KHRoaXMub2JqLHQpO2lmKHMmJnMuY29uc3RydWN0b3I9PT1pLkhhbHQpcmV0dXJuIHMucmV0VmFsO3MmJnMuY29uc3RydWN0b3I9PT1pLkFsdGVyUmV0dXJuJiYocj1zLm5ld1JldFZhbCxpLmN1cnJlbnRSZXRWYWw9cil9cmV0dXJuIHJ9LGkuQWx0ZXJBcmdzPWZ1bmN0aW9uKGUsdCl7dGhpcy5tc2c9ZSx0aGlzLm5ld0FyZ3M9dH0saS5BbHRlclJldHVybj1mdW5jdGlvbihlLHQpe3RoaXMubXNnPWUsdGhpcy5uZXdSZXRWYWw9dH0saS5IYWx0PWZ1bmN0aW9uKGUsdCl7dGhpcy5tc2c9ZSx0aGlzLnJldFZhbD10fSxpLlByZXZlbnQ9ZnVuY3Rpb24oZSl7dGhpcy5tc2c9ZX0saS5FcnJvcj1pLkhhbHQ7dmFyIHM9ZS5BcnJheSxvPSJhZnRlciIsdT1bImJyb2FkY2FzdCIsIm1vbml0b3JlZCIsImJ1YmJsZXMiLCJjb250ZXh0IiwiY29udGV4dEZuIiwiY3VycmVudFRhcmdldCIsImRlZmF1bHRGbiIsImRlZmF1bHRUYXJnZXRPbmx5IiwiZGV0YWlscyIsImVtaXRGYWNhZGUiLCJmaXJlT25jZSIsImFzeW5jIiwiaG9zdCIsInByZXZlbnRhYmxlIiwicHJldmVudGVkRm4iLCJxdWV1YWJsZSIsInNpbGVudCIsInN0b3BwZWRGbiIsInRhcmdldCIsInR5cGUiXSxhPXMuaGFzaCh1KSxmPUFycmF5LnByb3RvdHlwZS5zbGljZSxsPTksYz0ieXVpOmxvZyIsaD1mdW5jdGlvbihlLHQsbil7dmFyIHI7Zm9yKHIgaW4gdClhW3JdJiYobnx8IShyIGluIGUpKSYmKGVbcl09dFtyXSk7cmV0dXJuIGV9O2UuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24odCxuKXt0aGlzLl9rZHM9ZS5DdXN0b21FdmVudC5rZWVwRGVwcmVjYXRlZFN1YnMsdGhpcy5pZD1lLmd1aWQoKSx0aGlzLnR5cGU9dCx0aGlzLnNpbGVudD10aGlzLmxvZ1N5c3RlbT10PT09Yyx0aGlzLl9rZHMmJih0aGlzLnN1YnNjcmliZXJzPXt9LHRoaXMuYWZ0ZXJzPXt9KSxuJiZoKHRoaXMsbiwhMCl9LGUuQ3VzdG9tRXZlbnQua2VlcERlcHJlY2F0ZWRTdWJzPSExLGUuQ3VzdG9tRXZlbnQubWl4Q29uZmlncz1oLGUuQ3VzdG9tRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplLkN1c3RvbUV2ZW50LHNpZ25hdHVyZTpsLGNvbnRleHQ6ZSxwcmV2ZW50YWJsZTohMCxidWJibGVzOiEwLGhhc1N1YnM6ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPTAscj10aGlzLl9zdWJzY3JpYmVycyxpPXRoaXMuX2FmdGVycyxzPXRoaXMuc2libGluZztyZXR1cm4gciYmKHQ9ci5sZW5ndGgpLGkmJihuPWkubGVuZ3RoKSxzJiYocj1zLl9zdWJzY3JpYmVycyxpPXMuX2FmdGVycyxyJiYodCs9ci5sZW5ndGgpLGkmJihuKz1pLmxlbmd0aCkpLGU/ZT09PSJhZnRlciI/bjp0OnQrbn0sbW9uaXRvcjpmdW5jdGlvbihlKXt0aGlzLm1vbml0b3JlZD0hMDt2YXIgdD10aGlzLmlkKyJ8Iit0aGlzLnR5cGUrIl8iK2Usbj1mLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiBuWzBdPXQsdGhpcy5ob3N0Lm9uLmFwcGx5KHRoaXMuaG9zdCxuKX0sZ2V0U3ViczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuc2libGluZyx0PXRoaXMuX3N1YnNjcmliZXJzLG49dGhpcy5fYWZ0ZXJzLHIsaTtyZXR1cm4gZSYmKHI9ZS5fc3Vic2NyaWJlcnMsaT1lLl9hZnRlcnMpLHI/dD90PXQuY29uY2F0KHIpOnQ9ci5jb25jYXQoKTp0P3Q9dC5jb25jYXQoKTp0PVtdLGk/bj9uPW4uY29uY2F0KGkpOm49aS5jb25jYXQoKTpuP249bi5jb25jYXQoKTpuPVtdLFt0LG5dfSxhcHBseUNvbmZpZzpmdW5jdGlvbihlLHQpe2godGhpcyxlLHQpfSxfb246ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM9bmV3IGUuU3Vic2NyaWJlcih0LG4scixpKSx1O3JldHVybiB0aGlzLmZpcmVPbmNlJiZ0aGlzLmZpcmVkJiYodT10aGlzLmZpcmVkV2l0aCx0aGlzLmVtaXRGYWNhZGUmJnRoaXMuX2FkZEZhY2FkZVRvQXJncyYmdGhpcy5fYWRkRmFjYWRlVG9BcmdzKHUpLHRoaXMuYXN5bmM/c2V0VGltZW91dChlLmJpbmQodGhpcy5fbm90aWZ5LHRoaXMscyx1KSwwKTp0aGlzLl9ub3RpZnkocyx1KSksaT09PW8/KHRoaXMuX2FmdGVyc3x8KHRoaXMuX2FmdGVycz1bXSksdGhpcy5fYWZ0ZXJzLnB1c2gocykpOih0aGlzLl9zdWJzY3JpYmVyc3x8KHRoaXMuX3N1YnNjcmliZXJzPVtdKSx0aGlzLl9zdWJzY3JpYmVycy5wdXNoKHMpKSx0aGlzLl9rZHMmJihpPT09bz90aGlzLmFmdGVyc1tzLmlkXT1zOnRoaXMuc3Vic2NyaWJlcnNbcy5pZF09cyksbmV3IGUuRXZlbnRIYW5kbGUodGhpcyxzKX0sc3Vic2NyaWJlOmZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yP2YuY2FsbChhcmd1bWVudHMsMik6bnVsbDtyZXR1cm4gdGhpcy5fb24oZSx0LG4sITApfSxvbjpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+Mj9mLmNhbGwoYXJndW1lbnRzLDIpOm51bGw7cmV0dXJuIHRoaXMubW9uaXRvcmVkJiZ0aGlzLmhvc3QmJnRoaXMuaG9zdC5fbW9uaXRvcigiYXR0YWNoIix0aGlzLHthcmdzOmFyZ3VtZW50c30pLHRoaXMuX29uKGUsdCxuLCEwKX0sYWZ0ZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjI/Zi5jYWxsKGFyZ3VtZW50cywyKTpudWxsO3JldHVybiB0aGlzLl9vbihlLHQsbixvKX0sZGV0YWNoOmZ1bmN0aW9uKGUsdCl7aWYoZSYmZS5kZXRhY2gpcmV0dXJuIGUuZGV0YWNoKCk7dmFyIG4scixpPTAscz10aGlzLl9zdWJzY3JpYmVycyxvPXRoaXMuX2FmdGVycztpZihzKWZvcihuPXMubGVuZ3RoO24+PTA7bi0tKXI9c1tuXSxyJiYoIWV8fGU9PT1yLmZuKSYmKHRoaXMuX2RlbGV0ZShyLHMsbiksaSsrKTtpZihvKWZvcihuPW8ubGVuZ3RoO24+PTA7bi0tKXI9b1tuXSxyJiYoIWV8fGU9PT1yLmZuKSYmKHRoaXMuX2RlbGV0ZShyLG8sbiksaSsrKTtyZXR1cm4gaX0sdW5zdWJzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2guYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfbm90aWZ5OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gcj1lLm5vdGlmeSh0LHRoaXMpLCExPT09cnx8dGhpcy5zdG9wcGVkPjE/ITE6ITB9LGxvZzpmdW5jdGlvbihlLHQpe30sZmlyZTpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBlLnB1c2guYXBwbHkoZSxhcmd1bWVudHMpLHRoaXMuX2ZpcmUoZSl9LF9maXJlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmZpcmVPbmNlJiZ0aGlzLmZpcmVkPyEwOih0aGlzLmZpcmVkPSEwLHRoaXMuZmlyZU9uY2UmJih0aGlzLmZpcmVkV2l0aD1lKSx0aGlzLmVtaXRGYWNhZGU/dGhpcy5maXJlQ29tcGxleChlKTp0aGlzLmZpcmVTaW1wbGUoZSkpfSxmaXJlU2ltcGxlOmZ1bmN0aW9uKGUpe3RoaXMuc3RvcHBlZD0wLHRoaXMucHJldmVudGVkPTA7aWYodGhpcy5oYXNTdWJzKCkpe3ZhciB0PXRoaXMuZ2V0U3VicygpO3RoaXMuX3Byb2NTdWJzKHRbMF0sZSksdGhpcy5fcHJvY1N1YnModFsxXSxlKX1yZXR1cm4gdGhpcy5icm9hZGNhc3QmJnRoaXMuX2Jyb2FkY2FzdChlKSx0aGlzLnN0b3BwZWQ/ITE6ITB9LGZpcmVDb21wbGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdPWVbMF18fHt9LHRoaXMuZmlyZVNpbXBsZShlKX0sX3Byb2NTdWJzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHM7Zm9yKGk9MCxzPWUubGVuZ3RoO2k8cztpKyspe3I9ZVtpXTtpZihyJiZyLmZuKXshMT09PXRoaXMuX25vdGlmeShyLHQsbikmJih0aGlzLnN0b3BwZWQ9Mik7aWYodGhpcy5zdG9wcGVkPT09MilyZXR1cm4hMX19cmV0dXJuITB9LF9icm9hZGNhc3Q6ZnVuY3Rpb24odCl7aWYoIXRoaXMuc3RvcHBlZCYmdGhpcy5icm9hZGNhc3Qpe3ZhciBuPXQuY29uY2F0KCk7bi51bnNoaWZ0KHRoaXMudHlwZSksdGhpcy5ob3N0IT09ZSYmZS5maXJlLmFwcGx5KGUsbiksdGhpcy5icm9hZGNhc3Q9PT0yJiZlLkdsb2JhbC5maXJlLmFwcGx5KGUuR2xvYmFsLG4pfX0sdW5zdWJzY3JpYmVBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2hBbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxkZXRhY2hBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2goKX0sX2RlbGV0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5fd2hlbjt0fHwodD1yPT09bz90aGlzLl9hZnRlcnM6dGhpcy5fc3Vic2NyaWJlcnMpLHQmJihuPXMuaW5kZXhPZih0LGUsMCksZSYmdFtuXT09PWUmJnQuc3BsaWNlKG4sMSkpLHRoaXMuX2tkcyYmKHI9PT1vP2RlbGV0ZSB0aGlzLmFmdGVyc1tlLmlkXTpkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tlLmlkXSksdGhpcy5tb25pdG9yZWQmJnRoaXMuaG9zdCYmdGhpcy5ob3N0Ll9tb25pdG9yKCJkZXRhY2giLHRoaXMse2NlOnRoaXMsc3ViOmV9KSxlJiYoZS5kZWxldGVkPSEwKX19LGUuU3Vic2NyaWJlcj1mdW5jdGlvbih0LG4scixpKXt0aGlzLmZuPXQsdGhpcy5jb250ZXh0PW4sdGhpcy5pZD1lLmd1aWQoKSx0aGlzLmFyZ3M9cix0aGlzLl93aGVuPWl9LGUuU3Vic2NyaWJlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUuU3Vic2NyaWJlcixfbm90aWZ5OmZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLmRlbGV0ZWQmJiF0aGlzLnBvc3Rwb25lZCl7aWYoIXRoaXMucG9zdHBvbmVkKXJldHVybiBkZWxldGUgdGhpcy5wb3N0cG9uZWQsbnVsbDtkZWxldGUgdGhpcy5mbixkZWxldGUgdGhpcy5jb250ZXh0fXZhciByPXRoaXMuYXJncyxpO3N3aXRjaChuLnNpZ25hdHVyZSl7Y2FzZSAwOmk9dGhpcy5mbi5jYWxsKGUsbi50eXBlLHQsZSk7YnJlYWs7Y2FzZSAxOmk9dGhpcy5mbi5jYWxsKGUsdFswXXx8bnVsbCxlKTticmVhazsKZGVmYXVsdDpyfHx0Pyh0PXR8fFtdLHI9cj90LmNvbmNhdChyKTp0LGk9dGhpcy5mbi5hcHBseShlLHIpKTppPXRoaXMuZm4uY2FsbChlKX1yZXR1cm4gdGhpcy5vbmNlJiZuLl9kZWxldGUodGhpcyksaX0sbm90aWZ5OmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcy5jb250ZXh0LGk9ITA7cnx8KHI9bi5jb250ZXh0Rm4/bi5jb250ZXh0Rm4oKTpuLmNvbnRleHQpO2lmKGUuY29uZmlnJiZlLmNvbmZpZy50aHJvd0ZhaWwpaT10aGlzLl9ub3RpZnkocix0LG4pO2Vsc2UgdHJ5e2k9dGhpcy5fbm90aWZ5KHIsdCxuKX1jYXRjaChzKXtlLmVycm9yKHRoaXMrIiBmYWlsZWQ6ICIrcy5tZXNzYWdlLHMpfXJldHVybiBpfSxjb250YWluczpmdW5jdGlvbihlLHQpe3JldHVybiB0P3RoaXMuZm49PT1lJiZ0aGlzLmNvbnRleHQ9PT10OnRoaXMuZm49PT1lfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9fSxlLkV2ZW50SGFuZGxlPWZ1bmN0aW9uKGUsdCl7dGhpcy5ldnQ9ZSx0aGlzLnN1Yj10fSxlLkV2ZW50SGFuZGxlLnByb3RvdHlwZT17YmF0Y2g6ZnVuY3Rpb24odCxuKXt0LmNhbGwobnx8dGhpcyx0aGlzKSxlLkxhbmcuaXNBcnJheSh0aGlzLmV2dCkmJmUuQXJyYXkuZWFjaCh0aGlzLmV2dCxmdW5jdGlvbihlKXtlLmJhdGNoLmNhbGwobnx8ZSx0KX0pfSxkZXRhY2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmV2dCxuPTAscjtpZih0KWlmKGUuTGFuZy5pc0FycmF5KHQpKWZvcihyPTA7cjx0Lmxlbmd0aDtyKyspbis9dFtyXS5kZXRhY2goKTtlbHNlIHQuX2RlbGV0ZSh0aGlzLnN1Yiksbj0xO3JldHVybiBufSxtb25pdG9yOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmV2dC5tb25pdG9yLmFwcGx5KHRoaXMuZXZ0LGFyZ3VtZW50cyl9fTt2YXIgcD1lLkxhbmcsZD0iOiIsdj0ifCIsbT0ifkFGVEVSfiIsZz0vKC4qPykoOikoLio/KS8seT1lLmNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGcsIiokMiQzIil9KSxiPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIXR8fCFlfHxlLmluZGV4T2YoZCk+LTE/ZTp0K2QrZX0sdz1lLmNhY2hlZChmdW5jdGlvbihlLHQpe3ZhciBuPWUscixpLHM7cmV0dXJuIHAuaXNTdHJpbmcobik/KHM9bi5pbmRleE9mKG0pLHM+LTEmJihpPSEwLG49bi5zdWJzdHIobS5sZW5ndGgpKSxzPW4uaW5kZXhPZih2KSxzPi0xJiYocj1uLnN1YnN0cigwLHMpLG49bi5zdWJzdHIocysxKSxuPT09IioiJiYobj1udWxsKSksW3IsdD9iKG4sdCk6bixpLG5dKTpufSksRT1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl95dWlldnQscjtufHwobj10aGlzLl95dWlldnQ9e2V2ZW50czp7fSx0YXJnZXRzOm51bGwsY29uZmlnOntob3N0OnRoaXMsY29udGV4dDp0aGlzfSxjaGFpbjplLmNvbmZpZy5jaGFpbn0pLHI9bi5jb25maWcsdCYmKGgocix0LCEwKSx0LmNoYWluIT09dW5kZWZpbmVkJiYobi5jaGFpbj10LmNoYWluKSx0LnByZWZpeCYmKHIucHJlZml4PXQucHJlZml4KSl9O0UucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpFLG9uY2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZS5iYXRjaChmdW5jdGlvbihlKXtlLnN1YiYmKGUuc3ViLm9uY2U9ITApfSksZX0sb25jZUFmdGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5hZnRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGUuYmF0Y2goZnVuY3Rpb24oZSl7ZS5zdWImJihlLnN1Yi5vbmNlPSEwKX0pLGV9LHBhcnNlVHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiB3KGUsdHx8dGhpcy5feXVpZXZ0LmNvbmZpZy5wcmVmaXgpfSxvbjpmdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5feXVpZXZ0LHM9dyh0LGkuY29uZmlnLnByZWZpeCksbyx1LGEsbCxjLGgsZCx2PWUuRW52LmV2dC5oYW5kbGVzLGcseSxiLEU9ZS5Ob2RlLFMseCxUO3RoaXMuX21vbml0b3IoImF0dGFjaCIsc1sxXSx7YXJnczphcmd1bWVudHMsY2F0ZWdvcnk6c1swXSxhZnRlcjpzWzJdfSk7aWYocC5pc09iamVjdCh0KSlyZXR1cm4gcC5pc0Z1bmN0aW9uKHQpP2UuRG8uYmVmb3JlLmFwcGx5KGUuRG8sYXJndW1lbnRzKToobz1uLHU9cixhPWYuY2FsbChhcmd1bWVudHMsMCksbD1bXSxwLmlzQXJyYXkodCkmJihUPSEwKSxnPXQuX2FmdGVyLGRlbGV0ZSB0Ll9hZnRlcixlLmVhY2godCxmdW5jdGlvbihlLHQpe3AuaXNPYmplY3QoZSkmJihvPWUuZm58fChwLmlzRnVuY3Rpb24oZSk/ZTpvKSx1PWUuY29udGV4dHx8dSk7dmFyIG49Zz9tOiIiO2FbMF09bisoVD9lOnQpLGFbMV09byxhWzJdPXUsbC5wdXNoKHRoaXMub24uYXBwbHkodGhpcyxhKSl9LHRoaXMpLGkuY2hhaW4/dGhpczpuZXcgZS5FdmVudEhhbmRsZShsKSk7aD1zWzBdLGc9c1syXSxiPXNbM107aWYoRSYmZS5pbnN0YW5jZU9mKHRoaXMsRSkmJmIgaW4gRS5ET01fRVZFTlRTKXJldHVybiBhPWYuY2FsbChhcmd1bWVudHMsMCksYS5zcGxpY2UoMiwwLEUuZ2V0RE9NTm9kZSh0aGlzKSksZS5vbi5hcHBseShlLGEpO3Q9c1sxXTtpZihlLmluc3RhbmNlT2YodGhpcyxZVUkpKXt5PWUuRW52LmV2dC5wbHVnaW5zW3RdLGE9Zi5jYWxsKGFyZ3VtZW50cywwKSxhWzBdPWIsRSYmKFM9YVsyXSxlLmluc3RhbmNlT2YoUyxlLk5vZGVMaXN0KT9TPWUuTm9kZUxpc3QuZ2V0RE9NTm9kZXMoUyk6ZS5pbnN0YW5jZU9mKFMsRSkmJihTPUUuZ2V0RE9NTm9kZShTKSkseD1iIGluIEUuRE9NX0VWRU5UUyx4JiYoYVsyXT1TKSk7aWYoeSlkPXkub24uYXBwbHkoZSxhKTtlbHNlIGlmKCF0fHx4KWQ9ZS5FdmVudC5fYXR0YWNoKGEpfXJldHVybiBkfHwoYz1pLmV2ZW50c1t0XXx8dGhpcy5wdWJsaXNoKHQpLGQ9Yy5fb24obixyLGFyZ3VtZW50cy5sZW5ndGg+Mz9mLmNhbGwoYXJndW1lbnRzLDMpOm51bGwsZz8iYWZ0ZXIiOiEwKSx0LmluZGV4T2YoIio6IikhPT0tMSYmKHRoaXMuX2hhc1NpYmxpbmdzPSEwKSksaCYmKHZbaF09dltoXXx8e30sdltoXVt0XT12W2hdW3RdfHxbXSx2W2hdW3RdLnB1c2goZCkpLGkuY2hhaW4/dGhpczpkfSxzdWJzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGRldGFjaDpmdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5feXVpZXZ0LmV2ZW50cyxzLG89ZS5Ob2RlLHU9byYmZS5pbnN0YW5jZU9mKHRoaXMsbyk7aWYoIXQmJnRoaXMhPT1lKXtmb3IocyBpbiBpKWkuaGFzT3duUHJvcGVydHkocykmJmlbc10uZGV0YWNoKG4scik7cmV0dXJuIHUmJmUuRXZlbnQucHVyZ2VFbGVtZW50KG8uZ2V0RE9NTm9kZSh0aGlzKSksdGhpc312YXIgYT13KHQsdGhpcy5feXVpZXZ0LmNvbmZpZy5wcmVmaXgpLGw9cC5pc0FycmF5KGEpP2FbMF06bnVsbCxjPWE/YVszXTpudWxsLGgsZD1lLkVudi5ldnQuaGFuZGxlcyx2LG0sZyx5LGI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWVbdF0saSxzO2lmKHIpZm9yKHM9ci5sZW5ndGgtMTtzPj0wOy0tcylpPXJbc10uZXZ0LChpLmhvc3Q9PT1ufHxpLmVsPT09bikmJnJbc10uZGV0YWNoKCl9O2lmKGwpe209ZFtsXSx0PWFbMV0sdj11P2UuTm9kZS5nZXRET01Ob2RlKHRoaXMpOnRoaXM7aWYobSl7aWYodCliKG0sdCx2KTtlbHNlIGZvcihzIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShzKSYmYihtLHMsdik7cmV0dXJuIHRoaXN9fWVsc2V7aWYocC5pc09iamVjdCh0KSYmdC5kZXRhY2gpcmV0dXJuIHQuZGV0YWNoKCksdGhpcztpZih1JiYoIWN8fGMgaW4gby5ET01fRVZFTlRTKSlyZXR1cm4gZz1mLmNhbGwoYXJndW1lbnRzLDApLGdbMl09by5nZXRET01Ob2RlKHRoaXMpLGUuZGV0YWNoLmFwcGx5KGUsZyksdGhpc31oPWUuRW52LmV2dC5wbHVnaW5zW2NdO2lmKGUuaW5zdGFuY2VPZih0aGlzLFlVSSkpe2c9Zi5jYWxsKGFyZ3VtZW50cywwKTtpZihoJiZoLmRldGFjaClyZXR1cm4gaC5kZXRhY2guYXBwbHkoZSxnKSx0aGlzO2lmKCF0fHwhaCYmbyYmdCBpbiBvLkRPTV9FVkVOVFMpcmV0dXJuIGdbMF09dCxlLkV2ZW50LmRldGFjaC5hcHBseShlLkV2ZW50LGcpLHRoaXN9cmV0dXJuIHk9aVthWzFdXSx5JiZ5LmRldGFjaChuLHIpLHRoaXN9LHVuc3Vic2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGV0YWNoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZGV0YWNoQWxsOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRldGFjaChlKX0sdW5zdWJzY3JpYmVBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2hBbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxwdWJsaXNoOmZ1bmN0aW9uKHQsbil7dmFyIHIsaT10aGlzLl95dWlldnQscz1pLmNvbmZpZyxvPXMucHJlZml4O3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/KG8mJih0PWIodCxvKSkscj10aGlzLl9wdWJsaXNoKHQscyxuKSk6KHI9e30sZS5lYWNoKHQsZnVuY3Rpb24oZSx0KXtvJiYodD1iKHQsbykpLHJbdF09dGhpcy5fcHVibGlzaCh0LHMsZXx8bil9LHRoaXMpKSxyfSxfZ2V0RnVsbFR5cGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5feXVpZXZ0LmNvbmZpZy5wcmVmaXg7cmV0dXJuIHQ/dCtkK2U6ZX0sX3B1Ymxpc2g6ZnVuY3Rpb24odCxuLHIpe3ZhciBpLHM9dGhpcy5feXVpZXZ0LG89cy5jb25maWcsdT1vLmhvc3QsYT1vLmNvbnRleHQsZj1zLmV2ZW50cztyZXR1cm4gaT1mW3RdLChvLm1vbml0b3JlZCYmIWl8fGkmJmkubW9uaXRvcmVkKSYmdGhpcy5fbW9uaXRvcigicHVibGlzaCIsdCx7YXJnczphcmd1bWVudHN9KSxpfHwoaT1mW3RdPW5ldyBlLkN1c3RvbUV2ZW50KHQsbiksbnx8KGkuaG9zdD11LGkuY29udGV4dD1hKSksciYmaChpLHIsITApLGl9LF9tb25pdG9yOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHM7aWYodCl7dHlwZW9mIHQ9PSJzdHJpbmciPyhzPXQsaT10aGlzLmdldEV2ZW50KHQsITApKTooaT10LHM9dC50eXBlKTtpZih0aGlzLl95dWlldnQuY29uZmlnLm1vbml0b3JlZCYmKCFpfHxpLm1vbml0b3JlZCl8fGkmJmkubW9uaXRvcmVkKXI9cysiXyIrZSxuLm1vbml0b3JlZD1lLHRoaXMuZmlyZS5jYWxsKHRoaXMscixuKX19LGZpcmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dHlwZW9mIGU9PSJzdHJpbmciLG49YXJndW1lbnRzLmxlbmd0aCxyPWUsaT10aGlzLl95dWlldnQscz1pLmNvbmZpZyxvPXMucHJlZml4LHUsYSxsLGM7dCYmbjw9Mz9uPT09Mj9jPVthcmd1bWVudHNbMV1dOm49PT0zP2M9W2FyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl1dOmM9W106Yz1mLmNhbGwoYXJndW1lbnRzLHQ/MTowKSx0fHwocj1lJiZlLnR5cGUpLG8mJihyPWIocixvKSksYT1pLmV2ZW50c1tyXSx0aGlzLl9oYXNTaWJsaW5ncyYmKGw9dGhpcy5nZXRTaWJsaW5nKHIsYSksbCYmIWEmJihhPXRoaXMucHVibGlzaChyKSkpLChzLm1vbml0b3JlZCYmKCFhfHxhLm1vbml0b3JlZCl8fGEmJmEubW9uaXRvcmVkKSYmdGhpcy5fbW9uaXRvcigiZmlyZSIsYXx8cix7YXJnczpjfSk7aWYoIWEpe2lmKGkuaGFzVGFyZ2V0cylyZXR1cm4gdGhpcy5idWJibGUoe3R5cGU6cn0sYyx0aGlzKTt1PSEwfWVsc2UgbCYmKGEuc2libGluZz1sKSx1PWEuX2ZpcmUoYyk7cmV0dXJuIGkuY2hhaW4/dGhpczp1fSxnZXRTaWJsaW5nOmZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIGUuaW5kZXhPZihkKT4tMSYmKGU9eShlKSxuPXRoaXMuZ2V0RXZlbnQoZSwhMCksbiYmKG4uYXBwbHlDb25maWcodCksbi5idWJibGVzPSExLG4uYnJvYWRjYXN0PTApKSxufSxnZXRFdmVudDpmdW5jdGlvbihlLHQpe3ZhciBuLHI7cmV0dXJuIHR8fChuPXRoaXMuX3l1aWV2dC5jb25maWcucHJlZml4LGU9bj9iKGUsbik6ZSkscj10aGlzLl95dWlldnQuZXZlbnRzLHJbZV18fG51bGx9LGFmdGVyOmZ1bmN0aW9uKHQsbil7dmFyIHI9Zi5jYWxsKGFyZ3VtZW50cywwKTtzd2l0Y2gocC50eXBlKHQpKXtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gZS5Eby5hZnRlci5hcHBseShlLkRvLGFyZ3VtZW50cyk7Y2FzZSJhcnJheSI6Y2FzZSJvYmplY3QiOnJbMF0uX2FmdGVyPSEwO2JyZWFrO2RlZmF1bHQ6clswXT1tK3R9cmV0dXJuIHRoaXMub24uYXBwbHkodGhpcyxyKX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24uYXBwbHkKKHRoaXMsYXJndW1lbnRzKX19LGUuRXZlbnRUYXJnZXQ9RSxlLm1peChlLEUucHJvdG90eXBlKSxFLmNhbGwoZSx7YnViYmxlczohMX0pLFlVSS5FbnYuZ2xvYmFsRXZlbnRzPVlVSS5FbnYuZ2xvYmFsRXZlbnRzfHxuZXcgRSxlLkdsb2JhbD1ZVUkuRW52Lmdsb2JhbEV2ZW50c30sIjMuMTcuMiIse3JlcXVpcmVzOlsib29wIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImRvbS1jb3JlIixmdW5jdGlvbihlLHQpe3ZhciBuPSJub2RlVHlwZSIscj0ib3duZXJEb2N1bWVudCIsaT0iZG9jdW1lbnRFbGVtZW50IixzPSJkZWZhdWx0VmlldyIsbz0icGFyZW50V2luZG93Iix1PSJ0YWdOYW1lIixhPSJwYXJlbnROb2RlIixmPSJwcmV2aW91c1NpYmxpbmciLGw9Im5leHRTaWJsaW5nIixjPSJjb250YWlucyIsaD0iY29tcGFyZURvY3VtZW50UG9zaXRpb24iLHA9W10sZD1mdW5jdGlvbigpe3ZhciB0PWUuY29uZmlnLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKSxuPXQuYXBwZW5kQ2hpbGQoZS5jb25maWcuZG9jLmNyZWF0ZVRleHROb2RlKCIiKSkscj0hMTt0cnl7cj10LmNvbnRhaW5zKG4pfWNhdGNoKGkpe31yZXR1cm4gcn0oKSx2PXtieUlkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYuYWxsQnlJZChlLHQpWzBdfHxudWxsfSxnZXRJZDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gZS5pZCYmIWUuaWQudGFnTmFtZSYmIWUuaWQuaXRlbT90PWUuaWQ6ZS5hdHRyaWJ1dGVzJiZlLmF0dHJpYnV0ZXMuaWQmJih0PWUuYXR0cmlidXRlcy5pZC52YWx1ZSksdH0sc2V0SWQ6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHJpYnV0ZT9lLnNldEF0dHJpYnV0ZSgiaWQiLHQpOmUuaWQ9dH0sYW5jZXN0b3I6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9bnVsbDtyZXR1cm4gbiYmKGk9IXR8fHQoZSk/ZTpudWxsKSxpfHx2LmVsZW1lbnRCeUF4aXMoZSxhLHQsbnVsbCxyKX0sYW5jZXN0b3JzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUscz1bXTt3aGlsZShpPXYuYW5jZXN0b3IoaSx0LG4scikpe249ITE7aWYoaSl7cy51bnNoaWZ0KGkpO2lmKHImJnIoaSkpcmV0dXJuIHN9fXJldHVybiBzfSxlbGVtZW50QnlBeGlzOmZ1bmN0aW9uKGUsdCxuLHIsaSl7d2hpbGUoZSYmKGU9ZVt0XSkpe2lmKChyfHxlW3VdKSYmKCFufHxuKGUpKSlyZXR1cm4gZTtpZihpJiZpKGUpKXJldHVybiBudWxsfXJldHVybiBudWxsfSxjb250YWluczpmdW5jdGlvbihlLHQpe3ZhciByPSExO2lmKCF0fHwhZXx8IXRbbl18fCFlW25dKXI9ITE7ZWxzZSBpZihlW2NdJiYodFtuXT09PTF8fGQpKXI9ZVtjXSh0KTtlbHNlIGlmKGVbaF0pe2lmKGU9PT10fHwhIShlW2hdKHQpJjE2KSlyPSEwfWVsc2Ugcj12Ll9icnV0ZUNvbnRhaW5zKGUsdCk7cmV0dXJuIHJ9LGluRG9jOmZ1bmN0aW9uKGUsdCl7dmFyIG49ITEscztyZXR1cm4gZSYmZS5ub2RlVHlwZSYmKHR8fCh0PWVbcl0pLHM9dFtpXSxzJiZzLmNvbnRhaW5zJiZlLnRhZ05hbWU/bj1zLmNvbnRhaW5zKGUpOm49di5jb250YWlucyhzLGUpKSxufSxhbGxCeUlkOmZ1bmN0aW9uKHQsbil7bj1ufHxlLmNvbmZpZy5kb2M7dmFyIHI9W10saT1bXSxzLG87aWYobi5xdWVyeVNlbGVjdG9yQWxsKWk9bi5xdWVyeVNlbGVjdG9yQWxsKCdbaWQ9IicrdCsnIl0nKTtlbHNlIGlmKG4uYWxsKXtyPW4uYWxsKHQpO2lmKHIpe3Iubm9kZU5hbWUmJihyLmlkPT09dD8oaS5wdXNoKHIpLHI9cCk6cj1bcl0pO2lmKHIubGVuZ3RoKWZvcihzPTA7bz1yW3MrK107KShvLmlkPT09dHx8by5hdHRyaWJ1dGVzJiZvLmF0dHJpYnV0ZXMuaWQmJm8uYXR0cmlidXRlcy5pZC52YWx1ZT09PXQpJiZpLnB1c2gobyl9fWVsc2UgaT1bdi5fZ2V0RG9jKG4pLmdldEVsZW1lbnRCeUlkKHQpXTtyZXR1cm4gaX0saXNXaW5kb3c6ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5zY3JvbGxUbyYmZS5kb2N1bWVudCl9LF9yZW1vdmVDaGlsZE5vZGVzOmZ1bmN0aW9uKGUpe3doaWxlKGUuZmlyc3RDaGlsZCllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCl9LHNpYmxpbmdzOmZ1bmN0aW9uKGUsdCl7dmFyIG49W10scj1lO3doaWxlKHI9cltmXSlyW3VdJiYoIXR8fHQocikpJiZuLnVuc2hpZnQocik7cj1lO3doaWxlKHI9cltsXSlyW3VdJiYoIXR8fHQocikpJiZuLnB1c2gocik7cmV0dXJuIG59LF9icnV0ZUNvbnRhaW5zOmZ1bmN0aW9uKGUsdCl7d2hpbGUodCl7aWYoZT09PXQpcmV0dXJuITA7dD10LnBhcmVudE5vZGV9cmV0dXJuITF9LF9nZXRSZWdFeHA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD10fHwiIix2Ll9yZWdleENhY2hlPXYuX3JlZ2V4Q2FjaGV8fHt9LHYuX3JlZ2V4Q2FjaGVbZSt0XXx8KHYuX3JlZ2V4Q2FjaGVbZSt0XT1uZXcgUmVnRXhwKGUsdCkpLHYuX3JlZ2V4Q2FjaGVbZSt0XX0sX2dldERvYzpmdW5jdGlvbih0KXt2YXIgaT1lLmNvbmZpZy5kb2M7cmV0dXJuIHQmJihpPXRbbl09PT05P3Q6dFtyXXx8dC5kb2N1bWVudHx8ZS5jb25maWcuZG9jKSxpfSxfZ2V0V2luOmZ1bmN0aW9uKHQpe3ZhciBuPXYuX2dldERvYyh0KTtyZXR1cm4gbltzXXx8bltvXXx8ZS5jb25maWcud2lufSxfYmF0Y2g6ZnVuY3Rpb24oZSx0LG4scixpLHMpe3Q9dHlwZW9mIHQ9PSJzdHJpbmciP3ZbdF06dDt2YXIgbyx1PTAsYSxmO2lmKHQmJmUpd2hpbGUoYT1lW3UrK10pbz1vPXQuY2FsbCh2LGEsbixyLGkscyksdHlwZW9mIG8hPSJ1bmRlZmluZWQiJiYoZnx8KGY9W10pLGYucHVzaChvKSk7cmV0dXJuIHR5cGVvZiBmIT0idW5kZWZpbmVkIj9mOmV9LGdlbmVyYXRlSUQ6ZnVuY3Rpb24odCl7dmFyIG49dC5pZDtyZXR1cm4gbnx8KG49ZS5zdGFtcCh0KSx0LmlkPW4pLG59fTtlLkRPTT12fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJvb3AiLCJmZWF0dXJlcyJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkb20tYmFzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbmZpZy5kb2MuZG9jdW1lbnRFbGVtZW50LHI9ZS5ET00saT0idGFnTmFtZSIscz0ib3duZXJEb2N1bWVudCIsbz0iIix1PWUuRmVhdHVyZXMuYWRkLGE9ZS5GZWF0dXJlcy50ZXN0O2UubWl4KHIse2dldFRleHQ6bi50ZXh0Q29udGVudCE9PXVuZGVmaW5lZD9mdW5jdGlvbihlKXt2YXIgdD0iIjtyZXR1cm4gZSYmKHQ9ZS50ZXh0Q29udGVudCksdHx8IiJ9OmZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlJiYodD1lLmlubmVyVGV4dHx8ZS5ub2RlVmFsdWUpLHR8fCIifSxzZXRUZXh0Om4udGV4dENvbnRlbnQhPT11bmRlZmluZWQ/ZnVuY3Rpb24oZSx0KXtlJiYoZS50ZXh0Q29udGVudD10KX06ZnVuY3Rpb24oZSx0KXsiaW5uZXJUZXh0ImluIGU/ZS5pbm5lclRleHQ9dDoibm9kZVZhbHVlImluIGUmJihlLm5vZGVWYWx1ZT10KX0sQ1VTVE9NX0FUVFJJQlVURVM6bi5oYXNBdHRyaWJ1dGU/e2h0bWxGb3I6ImZvciIsY2xhc3NOYW1lOiJjbGFzcyJ9OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn0sc2V0QXR0cmlidXRlOmZ1bmN0aW9uKGUsdCxuLGkpe2UmJnQmJmUuc2V0QXR0cmlidXRlJiYodD1yLkNVU1RPTV9BVFRSSUJVVEVTW3RdfHx0LGUuc2V0QXR0cmlidXRlKHQsbixpKSl9LGdldEF0dHJpYnV0ZTpmdW5jdGlvbihlLHQsbil7bj1uIT09dW5kZWZpbmVkP246Mjt2YXIgaT0iIjtyZXR1cm4gZSYmdCYmZS5nZXRBdHRyaWJ1dGUmJih0PXIuQ1VTVE9NX0FUVFJJQlVURVNbdF18fHQsaT1lLnRhZ05hbWU9PT0iQlVUVE9OIiYmdD09PSJ2YWx1ZSI/ci5nZXRWYWx1ZShlKTplLmdldEF0dHJpYnV0ZSh0LG4pLGk9PT1udWxsJiYoaT0iIikpLGl9LFZBTFVFX1NFVFRFUlM6e30sVkFMVUVfR0VUVEVSUzp7fSxnZXRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0iIixuO3JldHVybiBlJiZlW2ldJiYobj1yLlZBTFVFX0dFVFRFUlNbZVtpXS50b0xvd2VyQ2FzZSgpXSxuP3Q9bihlKTp0PWUudmFsdWUpLHQ9PT1vJiYodD1vKSx0eXBlb2YgdD09InN0cmluZyI/dDoiIn0sc2V0VmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbjtlJiZlW2ldJiYobj1yLlZBTFVFX1NFVFRFUlNbZVtpXS50b0xvd2VyQ2FzZSgpXSx0PXQ9PT1udWxsPyIiOnQsbj9uKGUsdCk6ZS52YWx1ZT10KX0sY3JlYXRvcnM6e319KSx1KCJ2YWx1ZS1zZXQiLCJzZWxlY3QiLHt0ZXN0OmZ1bmN0aW9uKCl7dmFyIHQ9ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpO3JldHVybiB0LmlubmVySFRNTD0iPG9wdGlvbj4xPC9vcHRpb24+PG9wdGlvbj4yPC9vcHRpb24+Iix0LnZhbHVlPSIyIix0LnZhbHVlJiZ0LnZhbHVlPT09IjIifX0pLGEoInZhbHVlLXNldCIsInNlbGVjdCIpfHwoci5WQUxVRV9TRVRURVJTLnNlbGVjdD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLGk9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3B0aW9uIikscztzPWlbbisrXTspaWYoci5nZXRWYWx1ZShzKT09PXQpe3Muc2VsZWN0ZWQ9ITA7YnJlYWt9fSksZS5taXgoci5WQUxVRV9HRVRURVJTLHtidXR0b246ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXR0cmlidXRlcyYmZS5hdHRyaWJ1dGVzLnZhbHVlP2UuYXR0cmlidXRlcy52YWx1ZS52YWx1ZToiIn19KSxlLm1peChyLlZBTFVFX1NFVFRFUlMse2J1dHRvbjpmdW5jdGlvbihlLHQpe3ZhciBuPWUuYXR0cmlidXRlcy52YWx1ZTtufHwobj1lW3NdLmNyZWF0ZUF0dHJpYnV0ZSgidmFsdWUiKSxlLnNldEF0dHJpYnV0ZU5vZGUobikpLG4udmFsdWU9dH19KSxlLm1peChyLlZBTFVFX0dFVFRFUlMse29wdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1lLmF0dHJpYnV0ZXM7cmV0dXJuIHQudmFsdWUmJnQudmFsdWUuc3BlY2lmaWVkP2UudmFsdWU6ZS50ZXh0fSxzZWxlY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS52YWx1ZSxuPWUub3B0aW9ucztyZXR1cm4gbiYmbi5sZW5ndGgmJihlLm11bHRpcGxlfHxlLnNlbGVjdGVkSW5kZXg+LTEmJih0PXIuZ2V0VmFsdWUobltlLnNlbGVjdGVkSW5kZXhdKSkpLHR9fSk7dmFyIGYsbCxjO2UubWl4KGUuRE9NLHtoYXNDbGFzczpmdW5jdGlvbih0LG4pe3ZhciByPWUuRE9NLl9nZXRSZWdFeHAoIig/Ol58XFxzKykiK24rIig/Olxccyt8JCkiKTtyZXR1cm4gci50ZXN0KHQuY2xhc3NOYW1lKX0sYWRkQ2xhc3M6ZnVuY3Rpb24odCxuKXtlLkRPTS5oYXNDbGFzcyh0LG4pfHwodC5jbGFzc05hbWU9ZS5MYW5nLnRyaW0oW3QuY2xhc3NOYW1lLG5dLmpvaW4oIiAiKSkpfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0LG4pe24mJmwodCxuKSYmKHQuY2xhc3NOYW1lPWUuTGFuZy50cmltKHQuY2xhc3NOYW1lLnJlcGxhY2UoZS5ET00uX2dldFJlZ0V4cCgiKD86XnxcXHMrKSIrbisiKD86XFxzK3wkKSIpLCIgIikpLGwodCxuKSYmYyh0LG4pKX0scmVwbGFjZUNsYXNzOmZ1bmN0aW9uKGUsdCxuKXtjKGUsdCksZihlLG4pfSx0b2dnbGVDbGFzczpmdW5jdGlvbihlLHQsbil7dmFyIHI9biE9PXVuZGVmaW5lZD9uOiFsKGUsdCk7cj9mKGUsdCk6YyhlLHQpfX0pLGw9ZS5ET00uaGFzQ2xhc3MsYz1lLkRPTS5yZW1vdmVDbGFzcyxmPWUuRE9NLmFkZENsYXNzO3ZhciBoPS88KFthLXpdKykvaSxyPWUuRE9NLHU9ZS5GZWF0dXJlcy5hZGQsYT1lLkZlYXR1cmVzLnRlc3QscD17fSxkPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGk9ITA7ci5pbm5lckhUTUw9dDtpZighci5maXJzdENoaWxkfHxyLmZpcnN0Q2hpbGQudGFnTmFtZSE9PW4udG9VcHBlckNhc2UoKSlpPSExO3JldHVybiBpfSx2PS8oPzpcLyg/OnRoZWFkfHRmb290fHRib2R5fGNhcHRpb258Y29sfGNvbGdyb3VwKT4pK1xzKjx0Ym9keS8sbT0iPHRhYmxlPiIsZz0iPC90YWJsZT4iLHk7ZS5taXgoZS5ET00se19mcmFnQ2xvbmVzOnt9LF9jcmVhdGU6ZnVuY3Rpb24oZSx0LG4pe249bnx8ImRpdiI7dmFyIGk9ci5fZnJhZ0Nsb25lc1tuXTtyZXR1cm4gaT9pPWkuY2xvbmVOb2RlKCExKTppPXIuX2ZyYWdDbG9uZXNbbl09dC5jcmVhdGVFbGVtZW50KG4pLGkuaW5uZXJIVE1MPWUsaX0sX2NoaWxkcmVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPWUuY2hpbGRyZW4saSxzLG87ciYmci50YWdzJiYodD9yPWUuY2hpbGRyZW4udGFncyh0KTpzPXIudGFncygiISIpLmxlbmd0aCk7aWYoIXJ8fCFyLnRhZ3MmJnR8fHMpe2k9cnx8ZS5jaGlsZE5vZGVzLHI9W107d2hpbGUobz1pW24rK10pby5ub2RlVHlwZT09PTEmJighdHx8dD09PW8udGFnTmFtZSkmJnIucHVzaChvKX1yZXR1cm4gcnx8W119LGNyZWF0ZTpmdW5jdGlvbih0LG4pe3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9ZS5MYW5nLnRyaW0odCkpLG49bnx8ZS5jb25maWcuZG9jO3ZhciBpPWguZXhlYyh0KSxzPXIuX2NyZWF0ZSxvPXAsdT1udWxsLGEsZixsLGM7cmV0dXJuIHQhPXVuZGVmaW5lZCYmKGkmJmlbMV0mJihhPW9baVsxXS50b0xvd2VyQ2FzZSgpXSx0eXBlb2YgYT09ImZ1bmN0aW9uIj9zPWE6Zj1hKSxsPXModCxuLGYpLGM9bC5jaGlsZE5vZGVzLGMubGVuZ3RoPT09MT91PWwucmVtb3ZlQ2hpbGQoY1swXSk6Y1swXSYmY1swXS5jbGFzc05hbWU9PT0ieXVpMy1iaWctZHVtbXkiPyh5PWwuc2VsZWN0ZWRJbmRleCxjLmxlbmd0aD09PTI/dT1jWzBdLm5leHRTaWJsaW5nOihsLnJlbW92ZUNoaWxkKGNbMF0pLHU9ci5fbmwyZnJhZyhjLG4pKSk6dT1yLl9ubDJmcmFnKGMsbikpLHV9LF9ubDJmcmFnOmZ1bmN0aW9uKHQsbil7dmFyIHI9bnVsbCxpLHM7aWYodCYmKHQucHVzaHx8dC5pdGVtKSYmdFswXSl7bj1ufHx0WzBdLm93bmVyRG9jdW1lbnQscj1uLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSx0Lml0ZW0mJih0PWUuQXJyYXkodCwwLCEwKSk7Zm9yKGk9MCxzPXQubGVuZ3RoO2k8cztpKyspci5hcHBlbmRDaGlsZCh0W2ldKX1yZXR1cm4gcn0sYWRkSFRNTDpmdW5jdGlvbih0LG4saSl7dmFyIHM9dC5wYXJlbnROb2RlLG89MCx1LGE9bixmO2lmKG4hPXVuZGVmaW5lZClpZihuLm5vZGVUeXBlKWY9bjtlbHNlIGlmKHR5cGVvZiBuPT0ic3RyaW5nInx8dHlwZW9mIG49PSJudW1iZXIiKWE9Zj1yLmNyZWF0ZShuKTtlbHNlIGlmKG5bMF0mJm5bMF0ubm9kZVR5cGUpe2Y9ZS5jb25maWcuZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTt3aGlsZSh1PW5bbysrXSlmLmFwcGVuZENoaWxkKHUpfWlmKGkpaWYoZiYmaS5wYXJlbnROb2RlKWkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZixpKTtlbHNlIHN3aXRjaChpKXtjYXNlInJlcGxhY2UiOndoaWxlKHQuZmlyc3RDaGlsZCl0LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCk7ZiYmdC5hcHBlbmRDaGlsZChmKTticmVhaztjYXNlImJlZm9yZSI6ZiYmcy5pbnNlcnRCZWZvcmUoZix0KTticmVhaztjYXNlImFmdGVyIjpmJiYodC5uZXh0U2libGluZz9zLmluc2VydEJlZm9yZShmLHQubmV4dFNpYmxpbmcpOnMuYXBwZW5kQ2hpbGQoZikpO2JyZWFrO2RlZmF1bHQ6ZiYmdC5hcHBlbmRDaGlsZChmKX1lbHNlIGYmJnQuYXBwZW5kQ2hpbGQoZik7cmV0dXJuIHQubm9kZU5hbWU9PSJTRUxFQ1QiJiZ5PjAmJih0LnNlbGVjdGVkSW5kZXg9eS0xKSxhfSx3cmFwOmZ1bmN0aW9uKHQsbil7dmFyIHI9biYmbi5ub2RlVHlwZT9uOmUuRE9NLmNyZWF0ZShuKSxpPXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtpLmxlbmd0aCYmKHI9aVtpLmxlbmd0aC0xXSksdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHIsdCksci5hcHBlbmRDaGlsZCh0KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZSxuPXQubGFzdENoaWxkLHI9ZSxpO2lmKHQpe2k9dC5wYXJlbnROb2RlO2lmKGkpe2U9dC5maXJzdENoaWxkO3doaWxlKGUhPT1uKXI9ZS5uZXh0U2libGluZyxpLmluc2VydEJlZm9yZShlLHQpLGU9cjtpLnJlcGxhY2VDaGlsZChuLHQpfWVsc2UgdC5yZW1vdmVDaGlsZChlKX19fSksdSgiaW5uZXJodG1sIiwidGFibGUiLHt0ZXN0OmZ1bmN0aW9uKCl7dmFyIHQ9ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7dHJ5e3QuaW5uZXJIVE1MPSI8dGJvZHk+PC90Ym9keT4ifWNhdGNoKG4pe3JldHVybiExfXJldHVybiB0LmZpcnN0Q2hpbGQmJnQuZmlyc3RDaGlsZC5ub2RlTmFtZT09PSJUQk9EWSJ9fSksdSgiaW5uZXJodG1sLWRpdiIsInRyIix7dGVzdDpmdW5jdGlvbigpe3JldHVybiBkKCI8dHI+PC90cj4iLCJ0ciIpfX0pLHUoImlubmVyaHRtbC1kaXYiLCJzY3JpcHQiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIGQoIjxzY3JpcHQ+PC9zY3JpcHQ+Iiwic2NyaXB0Iil9fSksYSgiaW5uZXJodG1sIiwidGFibGUiKXx8KHAudGJvZHk9ZnVuY3Rpb24odCxuKXt2YXIgaT1yLmNyZWF0ZShtK3QrZyxuKSxzPWUuRE9NLl9jaGlsZHJlbihpLCJ0Ym9keSIpWzBdO3JldHVybiBpLmNoaWxkcmVuLmxlbmd0aD4xJiZzJiYhdi50ZXN0KHQpJiZzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocyksaX0pLGEoImlubmVyaHRtbC1kaXYiLCJzY3JpcHQiKXx8KHAuc2NyaXB0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gbi5pbm5lckhUTUw9Ii0iK2Usbi5yZW1vdmVDaGlsZChuLmZpcnN0Q2hpbGQpLG59LHAubGluaz1wLnN0eWxlPXAuc2NyaXB0KSxhKCJpbm5lcmh0bWwtZGl2IiwidHIiKXx8KGUubWl4KHAse29wdGlvbjpmdW5jdGlvbihlLHQpe3JldHVybiByLmNyZWF0ZSgnPHNlbGVjdD48b3B0aW9uIGNsYXNzPSJ5dWkzLWJpZy1kdW1teSIgc2VsZWN0ZWQ+PC9vcHRpb24+JytlKyI8L3NlbGVjdD4iLHQpfSx0cjpmdW5jdGlvbihlLHQpe3JldHVybiByLmNyZWF0ZSgiPHRib2R5PiIrZSsiPC90Ym9keT4iLHQpfSx0ZDpmdW5jdGlvbihlLHQpe3JldHVybiByLmNyZWF0ZSgiPHRyPiIrZSsiPC90cj4iLHQpfSxjb2w6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5jcmVhdGUoIjxjb2xncm91cD4iK2UrIjwvY29sZ3JvdXA+Iix0KX0sdGJvZHk6InRhYmxlIn0pLGUubWl4KHAse2xlZ2VuZDoiZmllbGRzZXQiCix0aDpwLnRkLHRoZWFkOnAudGJvZHksdGZvb3Q6cC50Ym9keSxjYXB0aW9uOnAudGJvZHksY29sZ3JvdXA6cC50Ym9keSxvcHRncm91cDpwLm9wdGlvbn0pKSxyLmNyZWF0b3JzPXAsZS5taXgoZS5ET00se3NldFdpZHRoOmZ1bmN0aW9uKHQsbil7ZS5ET00uX3NldFNpemUodCwid2lkdGgiLG4pfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCxuKXtlLkRPTS5fc2V0U2l6ZSh0LCJoZWlnaHQiLG4pfSxfc2V0U2l6ZTpmdW5jdGlvbihlLHQsbil7bj1uPjA/bjowO3ZhciByPTA7ZS5zdHlsZVt0XT1uKyJweCIscj10PT09ImhlaWdodCI/ZS5vZmZzZXRIZWlnaHQ6ZS5vZmZzZXRXaWR0aCxyPm4mJihuLT1yLW4sbjwwJiYobj0wKSxlLnN0eWxlW3RdPW4rInB4Iil9fSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1jb3JlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImNvbG9yLWJhc2UiLGZ1bmN0aW9uKGUsdCl7dmFyIG49L14jPyhbXGRhLWZBLUZdezJ9KShbXGRhLWZBLUZdezJ9KShbXGRhLWZBLUZdezJ9KShcdWZmZmUpPy8scj0vXiM/KFtcZGEtZkEtRl17MX0pKFtcZGEtZkEtRl17MX0pKFtcZGEtZkEtRl17MX0pKFx1ZmZmZSk/LyxpPS9yZ2JhP1woKFtcZF17MSwzfSksID8oW1xkXXsxLDN9KSwgPyhbXGRdezEsM30pLD8gPyhbLlxkXSopP1wpLyxzPXtIRVg6ImhleCIsUkdCOiJyZ2IiLFJHQkE6InJnYmEifSxvPXtoZXg6InRvSGV4IixyZ2I6InRvUkdCIixyZ2JhOiJ0b1JHQkEifTtlLkNvbG9yPXtLRVlXT1JEUzp7YmxhY2s6IjAwMCIsc2lsdmVyOiJjMGMwYzAiLGdyYXk6IjgwODA4MCIsd2hpdGU6ImZmZiIsbWFyb29uOiI4MDAwMDAiLHJlZDoiZjAwIixwdXJwbGU6IjgwMDA4MCIsZnVjaHNpYToiZjBmIixncmVlbjoiMDA4MDAwIixsaW1lOiIwZjAiLG9saXZlOiI4MDgwMDAiLHllbGxvdzoiZmYwIixuYXZ5OiIwMDAwODAiLGJsdWU6IjAwZiIsdGVhbDoiMDA4MDgwIixhcXVhOiIwZmYifSxSRUdFWF9IRVg6bixSRUdFWF9IRVgzOnIsUkVHRVhfUkdCOmkscmVfUkdCOmkscmVfaGV4Om4scmVfaGV4MzpyLFNUUl9IRVg6IiN7Kn17Kn17Kn0iLFNUUl9SR0I6InJnYih7Kn0sIHsqfSwgeyp9KSIsU1RSX1JHQkE6InJnYmEoeyp9LCB7Kn0sIHsqfSwgeyp9KSIsVFlQRVM6cyxDT05WRVJUUzpvLGNvbnZlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1lLkNvbG9yLkNPTlZFUlRTW24udG9Mb3dlckNhc2UoKV0saT10O3JldHVybiByJiZlLkNvbG9yW3JdJiYoaT1lLkNvbG9yW3JdKHQpKSxpfSx0b0hleDpmdW5jdGlvbih0KXt2YXIgbj1lLkNvbG9yLl9jb252ZXJ0VG8odCwiaGV4Iikscj1uLnRvTG93ZXJDYXNlKCk9PT0idHJhbnNwYXJlbnQiO3JldHVybiBuLmNoYXJBdCgwKSE9PSIjIiYmIXImJihuPSIjIituKSxyP24udG9Mb3dlckNhc2UoKTpuLnRvVXBwZXJDYXNlKCl9LHRvUkdCOmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IuX2NvbnZlcnRUbyh0LCJyZ2IiKTtyZXR1cm4gbi50b0xvd2VyQ2FzZSgpfSx0b1JHQkE6ZnVuY3Rpb24odCl7dmFyIG49ZS5Db2xvci5fY29udmVydFRvKHQsInJnYmEiKTtyZXR1cm4gbi50b0xvd2VyQ2FzZSgpfSx0b0FycmF5OmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IuZmluZFR5cGUodCkudG9VcHBlckNhc2UoKSxyLGkscyxvO3JldHVybiBuPT09IkhFWCImJnQubGVuZ3RoPDUmJihuPSJIRVgzIiksbi5jaGFyQXQobi5sZW5ndGgtMSk9PT0iQSImJihuPW4uc2xpY2UoMCwtMSkpLHI9ZS5Db2xvclsiUkVHRVhfIituXSxyJiYoaT1yLmV4ZWModCl8fFtdLHM9aS5sZW5ndGgscyYmKGkuc2hpZnQoKSxzLS0sbj09PSJIRVgzIiYmKGlbMF0rPWlbMF0saVsxXSs9aVsxXSxpWzJdKz1pWzJdKSxvPWlbcy0xXSxvfHwoaVtzLTFdPTEpKSksaX0sZnJvbUFycmF5OmZ1bmN0aW9uKHQsbil7dD10LmNvbmNhdCgpO2lmKHR5cGVvZiBuPT0idW5kZWZpbmVkIilyZXR1cm4gdC5qb2luKCIsICIpO3ZhciByPSJ7Kn0iO249ZS5Db2xvclsiU1RSXyIrbi50b1VwcGVyQ2FzZSgpXSx0Lmxlbmd0aD09PTMmJm4ubWF0Y2goL1x7XCpcfS9nKS5sZW5ndGg9PT00JiZ0LnB1c2goMSk7d2hpbGUobi5pbmRleE9mKHIpPj0wJiZ0Lmxlbmd0aD4wKW49bi5yZXBsYWNlKHIsdC5zaGlmdCgpKTtyZXR1cm4gbn0sZmluZFR5cGU6ZnVuY3Rpb24odCl7aWYoZS5Db2xvci5LRVlXT1JEU1t0XSlyZXR1cm4ia2V5d29yZCI7dmFyIG49dC5pbmRleE9mKCIoIikscjtyZXR1cm4gbj4wJiYocj10LnN1YnN0cigwLG4pKSxyJiZlLkNvbG9yLlRZUEVTW3IudG9VcHBlckNhc2UoKV0/ZS5Db2xvci5UWVBFU1tyLnRvVXBwZXJDYXNlKCldOiJoZXgifSxfZ2V0QWxwaGE6ZnVuY3Rpb24odCl7dmFyIG4scj1lLkNvbG9yLnRvQXJyYXkodCk7cmV0dXJuIHIubGVuZ3RoPjMmJihuPXIucG9wKCkpLCtufHwxfSxfa2V5d29yZFRvSGV4OmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IuS0VZV09SRFNbdF07aWYobilyZXR1cm4gbn0sX2NvbnZlcnRUbzpmdW5jdGlvbih0LG4pe2lmKHQ9PT0idHJhbnNwYXJlbnQiKXJldHVybiB0O3ZhciByPWUuQ29sb3IuZmluZFR5cGUodCksaT1uLHMsbyx1LGE7cmV0dXJuIHI9PT0ia2V5d29yZCImJih0PWUuQ29sb3IuX2tleXdvcmRUb0hleCh0KSxyPSJoZXgiKSxyPT09ImhleCImJnQubGVuZ3RoPDUmJih0LmNoYXJBdCgwKT09PSIjIiYmKHQ9dC5zdWJzdHIoMSkpLHQ9IiMiK3QuY2hhckF0KDApK3QuY2hhckF0KDApK3QuY2hhckF0KDEpK3QuY2hhckF0KDEpK3QuY2hhckF0KDIpK3QuY2hhckF0KDIpKSxyPT09bj90OihyLmNoYXJBdChyLmxlbmd0aC0xKT09PSJhIiYmKHI9ci5zbGljZSgwLC0xKSkscz1uLmNoYXJBdChuLmxlbmd0aC0xKT09PSJhIixzJiYobj1uLnNsaWNlKDAsLTEpLG89ZS5Db2xvci5fZ2V0QWxwaGEodCkpLGE9bi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStuLnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpLHU9ZS5Db2xvclsiXyIrcisiVG8iK2FdLHV8fHIhPT0icmdiIiYmbiE9PSJyZ2IiJiYodD1lLkNvbG9yWyJfIityKyJUb1JnYiJdKHQpLHI9InJnYiIsdT1lLkNvbG9yWyJfIityKyJUbyIrYV0pLHUmJih0PXUodCxzKSkscyYmKGUuTGFuZy5pc0FycmF5KHQpfHwodD1lLkNvbG9yLnRvQXJyYXkodCkpLHQucHVzaChvKSx0PWUuQ29sb3IuZnJvbUFycmF5KHQsaS50b1VwcGVyQ2FzZSgpKSksdCl9LF9oZXhUb1JnYjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtyZXR1cm4gZS5jaGFyQXQoMCk9PT0iIyImJihlPWUuc3Vic3RyKDEpKSxlPXBhcnNlSW50KGUsMTYpLG49ZT4+MTYscj1lPj44JjI1NSxpPWUmMjU1LHQ/W24scixpXToicmdiKCIrbisiLCAiK3IrIiwgIitpKyIpIn0sX3JnYlRvSGV4OmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IudG9BcnJheSh0KSxyPW5bMl18blsxXTw8OHxuWzBdPDwxNjtyPSgrcikudG9TdHJpbmcoMTYpO3doaWxlKHIubGVuZ3RoPDYpcj0iMCIrcjtyZXR1cm4iIyIrcn19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkb20tc3R5bGUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ImRvY3VtZW50RWxlbWVudCIscj0iZGVmYXVsdFZpZXciLGk9Im93bmVyRG9jdW1lbnQiLHM9InN0eWxlIixvPSJmbG9hdCIsdT0iY3NzRmxvYXQiLGE9InN0eWxlRmxvYXQiLGY9InRyYW5zcGFyZW50IixsPSJnZXRDb21wdXRlZFN0eWxlIixjPSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLGg9ZS5jb25maWcuZG9jLHA9ZS5ET00sZCx2LG09WyJXZWJraXRUcmFuc2Zvcm0iLCJNb3pUcmFuc2Zvcm0iLCJPVHJhbnNmb3JtIiwibXNUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iXSxnPS93aWR0aHxoZWlnaHR8dG9wfGxlZnR8cmlnaHR8Ym90dG9tfG1hcmdpbnxwYWRkaW5nL2k7ZS5BcnJheS5lYWNoKG0sZnVuY3Rpb24oZSl7ZSBpbiBoW25dLnN0eWxlJiYoZD1lLHY9ZSsiT3JpZ2luIil9KSxlLm1peChwLHtERUZBVUxUX1VOSVQ6InB4IixDVVNUT01fU1RZTEVTOnt9LHNldFN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe3I9cnx8ZS5zdHlsZTt2YXIgaT1wLkNVU1RPTV9TVFlMRVM7aWYocil7bj09PW51bGx8fG49PT0iIj9uPSIiOiFpc05hTihOdW1iZXIobikpJiZnLnRlc3QodCkmJihuKz1wLkRFRkFVTFRfVU5JVCk7aWYodCBpbiBpKXtpZihpW3RdLnNldCl7aVt0XS5zZXQoZSxuLHIpO3JldHVybn10eXBlb2YgaVt0XT09InN0cmluZyImJih0PWlbdF0pfWVsc2UgdD09PSIiJiYodD0iY3NzVGV4dCIsbj0iIik7clt0XT1ufX0sZ2V0U3R5bGU6ZnVuY3Rpb24oZSx0LG4pe249bnx8ZS5zdHlsZTt2YXIgcj1wLkNVU1RPTV9TVFlMRVMsaT0iIjtpZihuKXtpZih0IGluIHIpe2lmKHJbdF0uZ2V0KXJldHVybiByW3RdLmdldChlLHQsbik7dHlwZW9mIHJbdF09PSJzdHJpbmciJiYodD1yW3RdKX1pPW5bdF0saT09PSIiJiYoaT1wW2xdKGUsdCkpfXJldHVybiBpfSxzZXRTdHlsZXM6ZnVuY3Rpb24odCxuKXt2YXIgcj10LnN0eWxlO2UuZWFjaChuLGZ1bmN0aW9uKGUsbil7cC5zZXRTdHlsZSh0LG4sZSxyKX0scCl9LGdldENvbXB1dGVkU3R5bGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIixvPWVbaV0sdTtyZXR1cm4gZVtzXSYmb1tyXSYmb1tyXVtsXSYmKHU9b1tyXVtsXShlLG51bGwpLHUmJihuPXVbdF0pKSxufX0pLGhbbl1bc11bdV0hPT11bmRlZmluZWQ/cC5DVVNUT01fU1RZTEVTW29dPXU6aFtuXVtzXVthXSE9PXVuZGVmaW5lZCYmKHAuQ1VTVE9NX1NUWUxFU1tvXT1hKSxlLlVBLndlYmtpdCYmKHBbbF09ZnVuY3Rpb24oZSx0KXt2YXIgbj1lW2ldW3JdLHM9bltsXShlLCIiKVt0XTtyZXR1cm4gcz09PSJyZ2JhKDAsIDAsIDAsIDApIiYmKHM9Ziksc30pLGUuRE9NLl9nZXRBdHRyT2Zmc2V0PWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5ET01bbF0odCxuKSxpPXQub2Zmc2V0UGFyZW50LHMsbyx1O3JldHVybiByPT09ImF1dG8iJiYocz1lLkRPTS5nZXRTdHlsZSh0LCJwb3NpdGlvbiIpLHM9PT0ic3RhdGljInx8cz09PSJyZWxhdGl2ZSI/cj0wOmkmJmlbY10mJihvPWlbY10oKVtuXSx1PXRbY10oKVtuXSxuPT09ImxlZnQifHxuPT09InRvcCI/cj11LW86cj1vLXRbY10oKVtuXSkpLHJ9LGUuRE9NLl9nZXRPZmZzZXQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1udWxsO3JldHVybiBlJiYodD1wLmdldFN0eWxlKGUsInBvc2l0aW9uIiksbj1bcGFyc2VJbnQocFtsXShlLCJsZWZ0IiksMTApLHBhcnNlSW50KHBbbF0oZSwidG9wIiksMTApXSxpc05hTihuWzBdKSYmKG5bMF09cGFyc2VJbnQocC5nZXRTdHlsZShlLCJsZWZ0IiksMTApLGlzTmFOKG5bMF0pJiYoblswXT10PT09InJlbGF0aXZlIj8wOmUub2Zmc2V0TGVmdHx8MCkpLGlzTmFOKG5bMV0pJiYoblsxXT1wYXJzZUludChwLmdldFN0eWxlKGUsInRvcCIpLDEwKSxpc05hTihuWzFdKSYmKG5bMV09dD09PSJyZWxhdGl2ZSI/MDplLm9mZnNldFRvcHx8MCkpKSxufSxkJiYocC5DVVNUT01fU1RZTEVTLnRyYW5zZm9ybT17c2V0OmZ1bmN0aW9uKGUsdCxuKXtuW2RdPXR9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gcFtsXShlLGQpfX0scC5DVVNUT01fU1RZTEVTLnRyYW5zZm9ybU9yaWdpbj17c2V0OmZ1bmN0aW9uKGUsdCxuKXtuW3ZdPXR9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gcFtsXShlLHYpfX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJkb20tYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJzZWxlY3Rvci1uYXRpdmUiLGZ1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKGUpe2UubmFtZXNwYWNlKCJTZWxlY3RvciIpO3ZhciB0PSJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsbj0ib3duZXJEb2N1bWVudCIscj17X3R5cGVzOntlc2M6e3Rva2VuOiJcdWUwMDAiLHJlOi9cXFs6XFtcXVwoXCkjXC5cJ1w+K34iXS9naX0sYXR0cjp7dG9rZW46Ilx1ZTAwMSIscmU6LyhcW1teXF1dKlxdKS9nfSxwc2V1ZG86e3Rva2VuOiJcdWUwMDIiLHJlOi8oXChbXlwpXSpcKSkvZ319LHVzZU5hdGl2ZTohMCxfZXNjYXBlSWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJihlPWUucmVwbGFjZSgvKFs6XFtcXVwoXCkjXC4nPD4rfiJdKS9nLCJcXCQxIikpLGV9LF9jb21wYXJlOiJzb3VyY2VJbmRleCJpbiBlLmNvbmZpZy5kb2MuZG9jdW1lbnRFbGVtZW50P2Z1bmN0aW9uKGUsdCl7dmFyIG49ZS5zb3VyY2VJbmRleCxyPXQuc291cmNlSW5kZXg7cmV0dXJuIG49PT1yPzA6bj5yPzE6LTF9OmUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnRbdF0/ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZVt0XShuKSY0Py0xOjF9OmZ1bmN0aW9uKGUsdCl7dmFyIHIsaSxzO3JldHVybiBlJiZ0JiYocj1lW25dLmNyZWF0ZVJhbmdlKCksci5zZXRTdGFydChlLDApLGk9dFtuXS5jcmVhdGVSYW5nZSgpLGkuc2V0U3RhcnQodCwwKSxzPXIuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKDEsaSkpLHN9LF9zb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYodD1lLkFycmF5KHQsMCwhMCksdC5zb3J0JiZ0LnNvcnQoci5fY29tcGFyZSkpLHR9LF9kZUR1cGU6ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbixyO2ZvcihuPTA7cj1lW24rK107KXIuX2ZvdW5kfHwodFt0Lmxlbmd0aF09cixyLl9mb3VuZD0hMCk7Zm9yKG49MDtyPXRbbisrXTspci5fZm91bmQ9bnVsbCxyLnJlbW92ZUF0dHJpYnV0ZSgiX2ZvdW5kIik7cmV0dXJuIHR9LHF1ZXJ5OmZ1bmN0aW9uKHQsbixpLHMpe249bnx8ZS5jb25maWcuZG9jO3ZhciBvPVtdLHU9ZS5TZWxlY3Rvci51c2VOYXRpdmUmJmUuY29uZmlnLmRvYy5xdWVyeVNlbGVjdG9yJiYhcyxhPVtbdCxuXV0sZixsLGMsaD11P2UuU2VsZWN0b3IuX25hdGl2ZVF1ZXJ5OmUuU2VsZWN0b3IuX2JydXRlUXVlcnk7aWYodCYmaCl7IXMmJighdXx8bi50YWdOYW1lKSYmKGE9ci5fc3BsaXRRdWVyaWVzKHQsbikpO2ZvcihjPTA7Zj1hW2MrK107KWw9aChmWzBdLGZbMV0saSksaXx8KGw9ZS5BcnJheShsLDAsITApKSxsJiYobz1vLmNvbmNhdChsKSk7YS5sZW5ndGg+MSYmKG89ci5fc29ydChyLl9kZUR1cGUobykpKX1yZXR1cm4gaT9vWzBdfHxudWxsOm99LF9yZXBsYWNlU2VsZWN0b3I6ZnVuY3Rpb24odCl7dmFyIG49ZS5TZWxlY3Rvci5fcGFyc2UoImVzYyIsdCksaSxzO3JldHVybiB0PWUuU2VsZWN0b3IuX3JlcGxhY2UoImVzYyIsdCkscz1lLlNlbGVjdG9yLl9wYXJzZSgicHNldWRvIix0KSx0PXIuX3JlcGxhY2UoInBzZXVkbyIsdCksaT1lLlNlbGVjdG9yLl9wYXJzZSgiYXR0ciIsdCksdD1lLlNlbGVjdG9yLl9yZXBsYWNlKCJhdHRyIix0KSx7ZXNjOm4sYXR0cnM6aSxwc2V1ZG9zOnMsc2VsZWN0b3I6dH19LF9yZXN0b3JlU2VsZWN0b3I6ZnVuY3Rpb24odCl7dmFyIG49dC5zZWxlY3RvcjtyZXR1cm4gbj1lLlNlbGVjdG9yLl9yZXN0b3JlKCJhdHRyIixuLHQuYXR0cnMpLG49ZS5TZWxlY3Rvci5fcmVzdG9yZSgicHNldWRvIixuLHQucHNldWRvcyksbj1lLlNlbGVjdG9yLl9yZXN0b3JlKCJlc2MiLG4sdC5lc2MpLG59LF9yZXBsYWNlQ29tbWFzOmZ1bmN0aW9uKHQpe3ZhciBuPWUuU2VsZWN0b3IuX3JlcGxhY2VTZWxlY3Rvcih0KSx0PW4uc2VsZWN0b3I7cmV0dXJuIHQmJih0PXQucmVwbGFjZSgvLC9nLCJcdWUwMDciKSxuLnNlbGVjdG9yPXQsdD1lLlNlbGVjdG9yLl9yZXN0b3JlU2VsZWN0b3IobikpLHR9LF9zcGxpdFF1ZXJpZXM6ZnVuY3Rpb24odCxuKXt0LmluZGV4T2YoIiwiKT4tMSYmKHQ9ZS5TZWxlY3Rvci5fcmVwbGFjZUNvbW1hcyh0KSk7dmFyIHI9dC5zcGxpdCgiXHVlMDA3IiksaT1bXSxzPSIiLG8sdSxhO2lmKG4pe24ubm9kZVR5cGU9PT0xJiYobz1lLlNlbGVjdG9yLl9lc2NhcGVJZChlLkRPTS5nZXRJZChuKSksb3x8KG89ZS5ndWlkKCksZS5ET00uc2V0SWQobixvKSkscz0nW2lkPSInK28rJyJdICcpO2Zvcih1PTAsYT1yLmxlbmd0aDt1PGE7Kyt1KXQ9cytyW3VdLGkucHVzaChbdCxuXSl9cmV0dXJuIGl9LF9uYXRpdmVRdWVyeTpmdW5jdGlvbih0LG4scil7aWYoKGUuVUEud2Via2l0fHxlLlVBLm9wZXJhKSYmdC5pbmRleE9mKCI6Y2hlY2tlZCIpPi0xJiZlLlNlbGVjdG9yLnBzZXVkb3MmJmUuU2VsZWN0b3IucHNldWRvcy5jaGVja2VkKXJldHVybiBlLlNlbGVjdG9yLnF1ZXJ5KHQsbixyLCEwKTt0cnl7cmV0dXJuIG5bInF1ZXJ5U2VsZWN0b3IiKyhyPyIiOiJBbGwiKV0odCl9Y2F0Y2goaSl7cmV0dXJuIGUuU2VsZWN0b3IucXVlcnkodCxuLHIsITApfX0sZmlsdGVyOmZ1bmN0aW9uKHQsbil7dmFyIHI9W10saSxzO2lmKHQmJm4pZm9yKGk9MDtzPXRbaSsrXTspZS5TZWxlY3Rvci50ZXN0KHMsbikmJihyW3IubGVuZ3RoXT1zKTtyZXR1cm4gcn0sdGVzdDpmdW5jdGlvbih0LHIsaSl7dmFyIHM9ITEsbz0hMSx1LGEsZixsLGMsaCxwLGQsdjtpZih0JiZ0LnRhZ05hbWUpaWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpcz1yLmNhbGwodCx0KTtlbHNle3U9ci5zcGxpdCgiLCIpLCFpJiYhZS5ET00uaW5Eb2ModCkmJihhPXQucGFyZW50Tm9kZSxhP2k9YTooYz10W25dLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxjLmFwcGVuZENoaWxkKHQpLGk9YyxvPSEwKSksaT1pfHx0W25dLGg9ZS5TZWxlY3Rvci5fZXNjYXBlSWQoZS5ET00uZ2V0SWQodCkpLGh8fChoPWUuZ3VpZCgpLGUuRE9NLnNldElkKHQsaCkpO2ZvcihwPTA7dj11W3ArK107KXt2Kz0nW2lkPSInK2grJyJdJyxsPWUuU2VsZWN0b3IucXVlcnkodixpKTtmb3IoZD0wO2Y9bFtkKytdOylpZihmPT09dCl7cz0hMDticmVha31pZihzKWJyZWFrfW8mJmMucmVtb3ZlQ2hpbGQodCl9cmV0dXJuIHN9LGFuY2VzdG9yOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gZS5ET00uYW5jZXN0b3IodCxmdW5jdGlvbih0KXtyZXR1cm4gZS5TZWxlY3Rvci50ZXN0KHQsbil9LHIpfSxfcGFyc2U6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5tYXRjaChlLlNlbGVjdG9yLl90eXBlc1t0XS5yZSl9LF9yZXBsYWNlOmZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5TZWxlY3Rvci5fdHlwZXNbdF07cmV0dXJuIG4ucmVwbGFjZShyLnJlLHIudG9rZW4pfSxfcmVzdG9yZTpmdW5jdGlvbih0LG4scil7aWYocil7dmFyIGk9ZS5TZWxlY3Rvci5fdHlwZXNbdF0udG9rZW4scyxvO2ZvcihzPTAsbz1yLmxlbmd0aDtzPG87KytzKW49bi5yZXBsYWNlKGkscltzXSl9cmV0dXJuIG59fTtlLm1peChlLlNlbGVjdG9yLHIsITApfSkoZSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInNlbGVjdG9yIixmdW5jdGlvbihlLHQpe30sIjMuMTcuMiIse3JlcXVpcmVzOlsic2VsZWN0b3ItbmF0aXZlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtY29yZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj0iLiIscj0ibm9kZU5hbWUiLGk9Im5vZGVUeXBlIixzPSJvd25lckRvY3VtZW50IixvPSJ0YWdOYW1lIix1PSJfeXVpZCIsYT17fSxmPUFycmF5LnByb3RvdHlwZS5zbGljZSxsPWUuRE9NLGM9ZnVuY3Rpb24odCl7aWYoIXRoaXMuZ2V0RE9NTm9kZSlyZXR1cm4gbmV3IGModCk7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt0PWMuX2Zyb21TdHJpbmcodCk7aWYoIXQpcmV0dXJuIG51bGx9dmFyIG49dC5ub2RlVHlwZSE9PTk/dC51bmlxdWVJRDp0W3VdO24mJmMuX2luc3RhbmNlc1tuXSYmYy5faW5zdGFuY2VzW25dLl9ub2RlIT09dCYmKHRbdV09bnVsbCksbj1ufHxlLnN0YW1wKHQpLG58fChuPWUuZ3VpZCgpKSx0aGlzW3VdPW4sdGhpcy5fbm9kZT10LHRoaXMuX3N0YXRlUHJveHk9dCx0aGlzLl9pbml0UGx1Z2lucyYmdGhpcy5faW5pdFBsdWdpbnMoKX0saD1mdW5jdGlvbih0KXt2YXIgbj1udWxsO3JldHVybiB0JiYobj10eXBlb2YgdD09InN0cmluZyI/ZnVuY3Rpb24obil7cmV0dXJuIGUuU2VsZWN0b3IudGVzdChuLHQpfTpmdW5jdGlvbihuKXtyZXR1cm4gdChlLm9uZShuKSl9KSxufTtjLkFUVFJTPXt9LGMuRE9NX0VWRU5UUz17fSxjLl9mcm9tU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYodC5pbmRleE9mKCJkb2MiKT09PTA/dD1lLmNvbmZpZy5kb2M6dC5pbmRleE9mKCJ3aW4iKT09PTA/dD1lLmNvbmZpZy53aW46dD1lLlNlbGVjdG9yLnF1ZXJ5KHQsbnVsbCwhMCkpLHR8fG51bGx9LGMuTkFNRT0ibm9kZSIsYy5yZV9hcmlhPS9eKD86cm9sZSR8YXJpYS0pLyxjLlNIT1dfVFJBTlNJVElPTj0iZmFkZUluIixjLkhJREVfVFJBTlNJVElPTj0iZmFkZU91dCIsYy5faW5zdGFuY2VzPXt9LGMuZ2V0RE9NTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZT9lLm5vZGVUeXBlP2U6ZS5fbm9kZXx8bnVsbDpudWxsfSxjLnNjcnViVmFsPWZ1bmN0aW9uKHQsbil7aWYodCl7aWYodHlwZW9mIHQ9PSJvYmplY3QifHx0eXBlb2YgdD09ImZ1bmN0aW9uIilpZihpIGluIHR8fGwuaXNXaW5kb3codCkpdD1lLm9uZSh0KTtlbHNlIGlmKHQuaXRlbSYmIXQuX25vZGVzfHx0WzBdJiZ0WzBdW2ldKXQ9ZS5hbGwodCl9ZWxzZSB0eXBlb2YgdD09InVuZGVmaW5lZCI/dD1uOnQ9PT1udWxsJiYodD1udWxsKTtyZXR1cm4gdH0sYy5hZGRNZXRob2Q9ZnVuY3Rpb24oZSx0LG4pe2UmJnQmJnR5cGVvZiB0PT0iZnVuY3Rpb24iJiYoYy5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgZT1mLmNhbGwoYXJndW1lbnRzKSxyPXRoaXMsaTtyZXR1cm4gZVswXSYmZVswXS5fbm9kZSYmKGVbMF09ZVswXS5fbm9kZSksZVsxXSYmZVsxXS5fbm9kZSYmKGVbMV09ZVsxXS5fbm9kZSksZS51bnNoaWZ0KHIuX25vZGUpLGk9dC5hcHBseShufHxyLGUpLGkmJihpPWMuc2NydWJWYWwoaSxyKSksdHlwZW9mIGkhPSJ1bmRlZmluZWQifHwoaT1yKSxpfSl9LGMuaW1wb3J0TWV0aG9kPWZ1bmN0aW9uKHQsbixyKXt0eXBlb2Ygbj09InN0cmluZyI/KHI9cnx8bixjLmFkZE1ldGhvZChyLHRbbl0sdCkpOmUuQXJyYXkuZWFjaChuLGZ1bmN0aW9uKGUpe2MuaW1wb3J0TWV0aG9kKHQsZSl9KX0sYy5vbmU9ZnVuY3Rpb24odCl7dmFyIG49bnVsbCxyLGk7aWYodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt0PWMuX2Zyb21TdHJpbmcodCk7aWYoIXQpcmV0dXJuIG51bGx9ZWxzZSBpZih0LmdldERPTU5vZGUpcmV0dXJuIHQ7aWYodC5ub2RlVHlwZXx8ZS5ET00uaXNXaW5kb3codCkpe2k9dC51bmlxdWVJRCYmdC5ub2RlVHlwZSE9PTk/dC51bmlxdWVJRDp0Ll95dWlkLG49Yy5faW5zdGFuY2VzW2ldLHI9bj9uLl9ub2RlOm51bGw7aWYoIW58fHImJnQhPT1yKW49bmV3IGModCksdC5ub2RlVHlwZSE9MTEmJihjLl9pbnN0YW5jZXNbblt1XV09bil9fXJldHVybiBufSxjLkRFRkFVTFRfU0VUVEVSPWZ1bmN0aW9uKHQscil7dmFyIGk9dGhpcy5fc3RhdGVQcm94eSxzO3JldHVybiB0LmluZGV4T2Yobik+LTE/KHM9dCx0PXQuc3BsaXQobiksZS5PYmplY3Quc2V0VmFsdWUoaSx0LHIpKTp0eXBlb2YgaVt0XSE9InVuZGVmaW5lZCImJihpW3RdPXIpLHJ9LGMuREVGQVVMVF9HRVRURVI9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5fc3RhdGVQcm94eSxpO3JldHVybiB0LmluZGV4T2YmJnQuaW5kZXhPZihuKT4tMT9pPWUuT2JqZWN0LmdldFZhbHVlKHIsdC5zcGxpdChuKSk6dHlwZW9mIHJbdF0hPSJ1bmRlZmluZWQiJiYoaT1yW3RdKSxpfSxlLm1peChjLnByb3RvdHlwZSx7REFUQV9QUkVGSVg6ImRhdGEtIix0b1N0cmluZzpmdW5jdGlvbigpe3ZhciBlPXRoaXNbdV0rIjogbm90IGJvdW5kIHRvIGEgbm9kZSIsdD10aGlzLl9ub2RlLG4saSxzO3JldHVybiB0JiYobj10LmF0dHJpYnV0ZXMsaT1uJiZuLmlkP3QuZ2V0QXR0cmlidXRlKCJpZCIpOm51bGwscz1uJiZuLmNsYXNzTmFtZT90LmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik6bnVsbCxlPXRbcl0saSYmKGUrPSIjIitpKSxzJiYoZSs9Ii4iK3MucmVwbGFjZSgiICIsIi4iKSksZSs9IiAiK3RoaXNbdV0pLGV9LGdldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpcy5fZ2V0QXR0cj90PXRoaXMuX2dldEF0dHIoZSk6dD10aGlzLl9nZXQoZSksdD90PWMuc2NydWJWYWwodCx0aGlzKTp0PT09bnVsbCYmKHQ9bnVsbCksdH0sX2dldDpmdW5jdGlvbihlKXt2YXIgdD1jLkFUVFJTW2VdLG47cmV0dXJuIHQmJnQuZ2V0dGVyP249dC5nZXR0ZXIuY2FsbCh0aGlzKTpjLnJlX2FyaWEudGVzdChlKT9uPXRoaXMuX25vZGUuZ2V0QXR0cmlidXRlKGUsMik6bj1jLkRFRkFVTFRfR0VUVEVSLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxufSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1jLkFUVFJTW2VdO3JldHVybiB0aGlzLl9zZXRBdHRyP3RoaXMuX3NldEF0dHIuYXBwbHkodGhpcyxhcmd1bWVudHMpOm4mJm4uc2V0dGVyP24uc2V0dGVyLmNhbGwodGhpcyx0LGUpOmMucmVfYXJpYS50ZXN0KGUpP3RoaXMuX25vZGUuc2V0QXR0cmlidXRlKGUsdCk6Yy5ERUZBVUxUX1NFVFRFUi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpc30sc2V0QXR0cnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3NldEF0dHJzP3RoaXMuX3NldEF0dHJzKHQpOmUuT2JqZWN0LmVhY2godCxmdW5jdGlvbihlLHQpe3RoaXMuc2V0KHQsZSl9LHRoaXMpLHRoaXN9LGdldEF0dHJzOmZ1bmN0aW9uKHQpe3ZhciBuPXt9O3JldHVybiB0aGlzLl9nZXRBdHRycz90aGlzLl9nZXRBdHRycyh0KTplLkFycmF5LmVhY2godCxmdW5jdGlvbihlLHQpe25bZV09dGhpcy5nZXQoZSl9LHRoaXMpLG59LGNvbXBhcmVUbzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiBlJiZlLl9ub2RlJiYoZT1lLl9ub2RlKSx0PT09ZX0saW5Eb2M6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZTtpZih0KXtlPWU/ZS5fbm9kZXx8ZTp0W3NdO2lmKGUuZG9jdW1lbnRFbGVtZW50KXJldHVybiBsLmNvbnRhaW5zKGUuZG9jdW1lbnRFbGVtZW50LHQpfXJldHVybiExfSxnZXRCeUlkOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25vZGUscj1sLmJ5SWQodCxuW3NdKTtyZXR1cm4gciYmbC5jb250YWlucyhuLHIpP3I9ZS5vbmUocik6cj1udWxsLHJ9LGFuY2VzdG9yOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTImJih0eXBlb2Ygbj09InN0cmluZyJ8fHR5cGVvZiBuPT0iZnVuY3Rpb24iKSYmKHI9biksZS5vbmUobC5hbmNlc3Rvcih0aGlzLl9ub2RlLGgodCksbixoKHIpKSl9LGFuY2VzdG9yczpmdW5jdGlvbih0LG4scil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0yJiYodHlwZW9mIG49PSJzdHJpbmcifHx0eXBlb2Ygbj09ImZ1bmN0aW9uIikmJihyPW4pLGUuYWxsKGwuYW5jZXN0b3JzKHRoaXMuX25vZGUsaCh0KSxuLGgocikpKX0scHJldmlvdXM6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5vbmUobC5lbGVtZW50QnlBeGlzKHRoaXMuX25vZGUsInByZXZpb3VzU2libGluZyIsaCh0KSxuKSl9LG5leHQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5vbmUobC5lbGVtZW50QnlBeGlzKHRoaXMuX25vZGUsIm5leHRTaWJsaW5nIixoKHQpLG4pKX0sc2libGluZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWxsKGwuc2libGluZ3ModGhpcy5fbm9kZSxoKHQpKSl9LG9uZTpmdW5jdGlvbih0KXtyZXR1cm4gZS5vbmUoZS5TZWxlY3Rvci5xdWVyeSh0LHRoaXMuX25vZGUsITApKX0sYWxsOmZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0aGlzLl9ub2RlJiYobj1lLmFsbChlLlNlbGVjdG9yLnF1ZXJ5KHQsdGhpcy5fbm9kZSkpLG4uX3F1ZXJ5PXQsbi5fcXVlcnlSb290PXRoaXMuX25vZGUpLG58fGUuYWxsKFtdKX0sdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4gZS5TZWxlY3Rvci50ZXN0KHRoaXMuX25vZGUsdCl9LHJlbW92ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSxlJiZ0aGlzLmRlc3Ryb3koKSx0aGlzfSxyZXBsYWNlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX25vZGU7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9Yy5jcmVhdGUoZSkpLHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYy5nZXRET01Ob2RlKGUpLHQpLHRoaXN9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbih0LG4pe3JldHVybiB0eXBlb2YgdD09InN0cmluZyImJih0PWwuY3JlYXRlKHQpKSxlLm9uZSh0aGlzLl9ub2RlLnJlcGxhY2VDaGlsZChjLmdldERPTU5vZGUodCksYy5nZXRET01Ob2RlKG4pKSl9LGRlc3Ryb3k6ZnVuY3Rpb24odCl7dmFyIG49ZS5jb25maWcuZG9jLnVuaXF1ZUlEPyJ1bmlxdWVJRCI6Il95dWlkIixyO3RoaXMucHVyZ2UoKSx0aGlzLnVucGx1ZyYmdGhpcy51bnBsdWcoKSx0aGlzLmNsZWFyRGF0YSgpLHQmJmUuTm9kZUxpc3QuZWFjaCh0aGlzLmFsbCgiKiIpLGZ1bmN0aW9uKHQpe3I9Yy5faW5zdGFuY2VzW3Rbbl1dLHI/ci5kZXN0cm95KCk6ZS5FdmVudC5wdXJnZUVsZW1lbnQodCl9KSx0aGlzLl9ub2RlPW51bGwsdGhpcy5fc3RhdGVQcm94eT1udWxsLGRlbGV0ZSBjLl9pbnN0YW5jZXNbdGhpcy5feXVpZF19LGludm9rZTpmdW5jdGlvbihlLHQsbixyLGkscyl7dmFyIG89dGhpcy5fbm9kZSx1O3JldHVybiB0JiZ0Ll9ub2RlJiYodD10Ll9ub2RlKSxuJiZuLl9ub2RlJiYobj1uLl9ub2RlKSx1PW9bZV0odCxuLHIsaSxzKSxjLnNjcnViVmFsKHUsdGhpcyl9LHN3YXA6ZS5jb25maWcuZG9jLmRvY3VtZW50RWxlbWVudC5zd2FwTm9kZT9mdW5jdGlvbihlKXt0aGlzLl9ub2RlLnN3YXBOb2RlKGMuZ2V0RE9NTm9kZShlKSl9OmZ1bmN0aW9uKGUpe2U9Yy5nZXRET01Ob2RlKGUpO3ZhciB0PXRoaXMuX25vZGUsbj1lLnBhcmVudE5vZGUscj1lLm5leHRTaWJsaW5nO3JldHVybiByPT09dD9uLmluc2VydEJlZm9yZSh0LGUpOmU9PT10Lm5leHRTaWJsaW5nP24uaW5zZXJ0QmVmb3JlKGUsdCk6KHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZSx0KSxsLmFkZEhUTUwobix0LHIpKSx0aGlzfSxoYXNNZXRob2Q6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZTtyZXR1cm4hKCEodCYmZSBpbiB0JiZ0eXBlb2YgdFtlXSE9InVua25vd24iKXx8dHlwZW9mIHRbZV0hPSJmdW5jdGlvbiImJlN0cmluZyh0W2VdKS5pbmRleE9mKCJmdW5jdGlvbiIpIT09MSl9LGlzRnJhZ21lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoIm5vZGVUeXBlIik9PT0xMX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoImNoaWxkTm9kZXMiKS5yZW1vdmUoKS5kZXN0cm95KCEwKSx0aGlzfSxnZXRET01Ob2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGV9fSwhMCksZS5Ob2RlPWMsZS5vbmU9Yy5vbmU7dmFyIHA9ZnVuY3Rpb24odCl7dmFyIG49W107dCYmKHR5cGVvZiB0PT0ic3RyaW5nIj8odGhpcy5fcXVlcnk9dCx0PWUuU2VsZWN0b3IucXVlcnkodCkpOnQubm9kZVR5cGV8fGwuaXNXaW5kb3codCk/dD1bdF06dC5fbm9kZT90PVt0Ll9ub2RlXToKdFswXSYmdFswXS5fbm9kZT8oZS5BcnJheS5lYWNoKHQsZnVuY3Rpb24oZSl7ZS5fbm9kZSYmbi5wdXNoKGUuX25vZGUpfSksdD1uKTp0PWUuQXJyYXkodCwwLCEwKSksdGhpcy5fbm9kZXM9dHx8W119O3AuTkFNRT0iTm9kZUxpc3QiLHAuZ2V0RE9NTm9kZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX25vZGVzP2UuX25vZGVzOmV9LHAuZWFjaD1mdW5jdGlvbih0LG4scil7dmFyIGk9dC5fbm9kZXM7aSYmaS5sZW5ndGgmJmUuQXJyYXkuZWFjaChpLG4scnx8dCl9LHAuYWRkTWV0aG9kPWZ1bmN0aW9uKHQsbixyKXt0JiZuJiYocC5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXt2YXIgdD1bXSxpPWFyZ3VtZW50cztyZXR1cm4gZS5BcnJheS5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKHMpe3ZhciBvPXMudW5pcXVlSUQmJnMubm9kZVR5cGUhPT05PyJ1bmlxdWVJRCI6Il95dWlkIix1PWUuTm9kZS5faW5zdGFuY2VzW3Nbb11dLGEsZjt1fHwodT1wLl9nZXRUZW1wTm9kZShzKSksYT1yfHx1LGY9bi5hcHBseShhLGkpLGYhPT11bmRlZmluZWQmJmYhPT11JiYodFt0Lmxlbmd0aF09Zil9KSx0Lmxlbmd0aD90OnRoaXN9KX0scC5pbXBvcnRNZXRob2Q9ZnVuY3Rpb24odCxuLHIpe3R5cGVvZiBuPT0ic3RyaW5nIj8ocj1yfHxuLHAuYWRkTWV0aG9kKG4sdFtuXSkpOmUuQXJyYXkuZWFjaChuLGZ1bmN0aW9uKGUpe3AuaW1wb3J0TWV0aG9kKHQsZSl9KX0scC5fZ2V0VGVtcE5vZGU9ZnVuY3Rpb24odCl7dmFyIG49cC5fdGVtcE5vZGU7cmV0dXJuIG58fChuPWUuTm9kZS5jcmVhdGUoIjxkaXY+PC9kaXY+IikscC5fdGVtcE5vZGU9biksbi5fbm9kZT10LG4uX3N0YXRlUHJveHk9dCxufSxlLm1peChwLnByb3RvdHlwZSx7X2ludm9rZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9bj9bXTp0aGlzO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSl7dmFyIHM9aVtlXS5hcHBseShpLHQpO24mJnIucHVzaChzKX0pLHJ9LGl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIGUub25lKCh0aGlzLl9ub2Rlc3x8W10pW3RdKX0sZWFjaDpmdW5jdGlvbih0LG4pe3ZhciByPXRoaXM7cmV0dXJuIGUuQXJyYXkuZWFjaCh0aGlzLl9ub2RlcyxmdW5jdGlvbihpLHMpe3JldHVybiBpPWUub25lKGkpLHQuY2FsbChufHxpLGkscyxyKX0pLHJ9LGJhdGNoOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztyZXR1cm4gZS5BcnJheS5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKGkscyl7dmFyIG89ZS5Ob2RlLl9pbnN0YW5jZXNbaVt1XV07cmV0dXJuIG98fChvPXAuX2dldFRlbXBOb2RlKGkpKSx0LmNhbGwobnx8byxvLHMscil9KSxyfSxzb21lOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztyZXR1cm4gZS5BcnJheS5zb21lKHRoaXMuX25vZGVzLGZ1bmN0aW9uKGkscyl7cmV0dXJuIGk9ZS5vbmUoaSksbj1ufHxpLHQuY2FsbChuLGkscyxyKX0pfSx0b0ZyYWc6ZnVuY3Rpb24oKXtyZXR1cm4gZS5vbmUoZS5ET00uX25sMmZyYWcodGhpcy5fbm9kZXMpKX0saW5kZXhPZjpmdW5jdGlvbih0KXtyZXR1cm4gZS5BcnJheS5pbmRleE9mKHRoaXMuX25vZGVzLGUuTm9kZS5nZXRET01Ob2RlKHQpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiBlLmFsbChlLlNlbGVjdG9yLmZpbHRlcih0aGlzLl9ub2Rlcyx0KSl9LG1vZHVsdXM6ZnVuY3Rpb24odCxuKXtuPW58fDA7dmFyIHI9W107cmV0dXJuIHAuZWFjaCh0aGlzLGZ1bmN0aW9uKGUsaSl7aSV0PT09biYmci5wdXNoKGUpfSksZS5hbGwocil9LG9kZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vZHVsdXMoMiwxKX0sZXZlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vZHVsdXMoMil9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxuPXRoaXMuX25vZGVzLHI9dGhpcy5fcXVlcnksaT10aGlzLl9xdWVyeVJvb3Q7cmV0dXJuIHImJihpfHxuJiZuWzBdJiZuWzBdLm93bmVyRG9jdW1lbnQmJihpPW5bMF0ub3duZXJEb2N1bWVudCksdGhpcy5fbm9kZXM9ZS5TZWxlY3Rvci5xdWVyeShyLGkpKSx0aGlzfSxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzLmxlbmd0aH0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2Rlcy5sZW5ndGg8MX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT0iIix0PXRoaXNbdV0rIjogbm90IGJvdW5kIHRvIGFueSBub2RlcyIsbj10aGlzLl9ub2RlcyxpO3JldHVybiBuJiZuWzBdJiYoaT1uWzBdLGUrPWlbcl0saS5pZCYmKGUrPSIjIitpLmlkKSxpLmNsYXNzTmFtZSYmKGUrPSIuIitpLmNsYXNzTmFtZS5yZXBsYWNlKCIgIiwiLiIpKSxuLmxlbmd0aD4xJiYoZSs9Ii4uLlsiK24ubGVuZ3RoKyIgaXRlbXNdIikpLGV8fHR9LGdldERPTU5vZGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzfX0sITApLHAuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJkZXN0cm95IiwiZW1wdHkiLCJyZW1vdmUiLCJzZXQiXSkscC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBuPVtdLHI9dGhpcy5fbm9kZXMsaT0hMSxzPXAuX2dldFRlbXBOb2RlLG8sdTtyZXR1cm4gclswXSYmKG89ZS5Ob2RlLl9pbnN0YW5jZXNbclswXS5feXVpZF18fHMoclswXSksdT1vLl9nZXQodCksdSYmdS5ub2RlVHlwZSYmKGk9ITApKSxlLkFycmF5LmVhY2gocixmdW5jdGlvbihyKXtvPWUuTm9kZS5faW5zdGFuY2VzW3IuX3l1aWRdLG98fChvPXMocikpLHU9by5fZ2V0KHQpLGl8fCh1PWUuTm9kZS5zY3J1YlZhbCh1LG8pKSxuLnB1c2godSl9KSxpP2UuYWxsKG4pOm59LGUuTm9kZUxpc3Q9cCxlLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHAoZSl9LGUuTm9kZS5hbGw9ZS5hbGw7dmFyIGQ9ZS5Ob2RlTGlzdCx2PUFycmF5LnByb3RvdHlwZSxtPXtjb25jYXQ6MSxwb3A6MCxwdXNoOjAsc2hpZnQ6MCxzbGljZToxLHNwbGljZToxLHVuc2hpZnQ6MH07ZS5PYmplY3QuZWFjaChtLGZ1bmN0aW9uKHQsbil7ZC5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXt2YXIgcj1bXSxpPTAscyxvO3doaWxlKHR5cGVvZiAocz1hcmd1bWVudHNbaSsrXSkhPSJ1bmRlZmluZWQiKXIucHVzaChzLl9ub2RlfHxzLl9ub2Rlc3x8cyk7cmV0dXJuIG89dltuXS5hcHBseSh0aGlzLl9ub2RlcyxyKSx0P289ZS5hbGwobyk6bz1lLk5vZGUuc2NydWJWYWwobyksb319KSxlLkFycmF5LmVhY2goWyJyZW1vdmVDaGlsZCIsImhhc0NoaWxkTm9kZXMiLCJjbG9uZU5vZGUiLCJoYXNBdHRyaWJ1dGUiLCJzY3JvbGxJbnRvVmlldyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZm9jdXMiLCJibHVyIiwic3VibWl0IiwicmVzZXQiLCJzZWxlY3QiLCJjcmVhdGVDYXB0aW9uIl0sZnVuY3Rpb24odCl7ZS5Ob2RlLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLG4scil7dmFyIGk9dGhpcy5pbnZva2UodCxlLG4scik7cmV0dXJuIGl9fSksZS5Ob2RlLnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZTtyZXR1cm4gdCYmdC5yZW1vdmVBdHRyaWJ1dGUoZSwwKSx0aGlzfSxlLk5vZGUuaW1wb3J0TWV0aG9kKGUuRE9NLFsiY29udGFpbnMiLCJzZXRBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJ3cmFwIiwidW53cmFwIiwiZ2VuZXJhdGVJRCJdKSxlLk5vZGVMaXN0LmltcG9ydE1ldGhvZChlLk5vZGUucHJvdG90eXBlLFsiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwidW53cmFwIiwid3JhcCIsImdlbmVyYXRlSUQiXSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1jb3JlIiwic2VsZWN0b3IiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgibm9kZS1iYXNlIixmdW5jdGlvbihlLHQpe3ZhciBuPVsiaGFzQ2xhc3MiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwicmVwbGFjZUNsYXNzIiwidG9nZ2xlQ2xhc3MiXTtlLk5vZGUuaW1wb3J0TWV0aG9kKGUuRE9NLG4pLGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsbik7dmFyIHI9ZS5Ob2RlLGk9ZS5ET007ci5jcmVhdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbiYmbi5fbm9kZSYmKG49bi5fbm9kZSksZS5vbmUoaS5jcmVhdGUodCxuKSl9LGUubWl4KHIucHJvdG90eXBlLHtjcmVhdGU6ci5jcmVhdGUsaW5zZXJ0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2luc2VydChlLHQpLHRoaXN9LF9pbnNlcnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9ub2RlLHI9bnVsbDtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiP3Q9dGhpcy5fbm9kZS5jaGlsZE5vZGVzW3RdOnQmJnQuX25vZGUmJih0PXQuX25vZGUpLGUmJnR5cGVvZiBlIT0ic3RyaW5nIiYmKGU9ZS5fbm9kZXx8ZS5fbm9kZXN8fGUpLHI9aS5hZGRIVE1MKG4sZSx0KSxyfSxwcmVwZW5kOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmluc2VydChlLDApfSxhcHBlbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaW5zZXJ0KGUsbnVsbCl9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUpe3JldHVybiByLnNjcnViVmFsKHRoaXMuX2luc2VydChlKSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LG4pe3JldHVybiBlLk5vZGUuc2NydWJWYWwodGhpcy5faW5zZXJ0KHQsbikpfSxhcHBlbmRUbzpmdW5jdGlvbih0KXtyZXR1cm4gZS5vbmUodCkuYXBwZW5kKHRoaXMpLHRoaXN9LHNldENvbnRlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2luc2VydChlLCJyZXBsYWNlIiksdGhpc30sZ2V0Q29udGVudDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIGUuX25vZGUubm9kZVR5cGU9PT0xMSYmKGU9ZS5jcmVhdGUoIjxkaXYvPiIpLmFwcGVuZChlLmNsb25lTm9kZSghMCkpKSxlLmdldCgiaW5uZXJIVE1MIil9fSksZS5Ob2RlLnByb3RvdHlwZS5zZXRIVE1MPWUuTm9kZS5wcm90b3R5cGUuc2V0Q29udGVudCxlLk5vZGUucHJvdG90eXBlLmdldEhUTUw9ZS5Ob2RlLnByb3RvdHlwZS5nZXRDb250ZW50LGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJhcHBlbmQiLCJpbnNlcnQiLCJhcHBlbmRDaGlsZCIsImluc2VydEJlZm9yZSIsInByZXBlbmQiLCJzZXRDb250ZW50IiwiZ2V0Q29udGVudCIsInNldEhUTUwiLCJnZXRIVE1MIl0pO3ZhciByPWUuTm9kZSxpPWUuRE9NO3IuQVRUUlM9e3RleHQ6e2dldHRlcjpmdW5jdGlvbigpe3JldHVybiBpLmdldFRleHQodGhpcy5fbm9kZSl9LHNldHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gaS5zZXRUZXh0KHRoaXMuX25vZGUsZSksZX19LCJmb3IiOntnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXRBdHRyaWJ1dGUodGhpcy5fbm9kZSwiZm9yIil9LHNldHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gaS5zZXRBdHRyaWJ1dGUodGhpcy5fbm9kZSwiZm9yIixlKSxlfX0sb3B0aW9uczp7Z2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9wdGlvbiIpfX0sY2hpbGRyZW46e2dldHRlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX25vZGUsbj10LmNoaWxkcmVuLHIsaSxzO2lmKCFuKXtyPXQuY2hpbGROb2RlcyxuPVtdO2ZvcihpPTAscz1yLmxlbmd0aDtpPHM7KytpKXJbaV0udGFnTmFtZSYmKG5bbi5sZW5ndGhdPXJbaV0pfXJldHVybiBlLmFsbChuKX19LHZhbHVlOntnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXRWYWx1ZSh0aGlzLl9ub2RlKX0sc2V0dGVyOmZ1bmN0aW9uKGUpe3JldHVybiBpLnNldFZhbHVlKHRoaXMuX25vZGUsZSksZX19fSxlLk5vZGUuaW1wb3J0TWV0aG9kKGUuRE9NLFsic2V0QXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIl0pO3ZhciByPWUuTm9kZSxzPWUuTm9kZUxpc3Q7ci5ET01fRVZFTlRTPXthYm9ydDoxLGJlZm9yZXVubG9hZDoxLGJsdXI6MSxjaGFuZ2U6MSxjbGljazoxLGNsb3NlOjEsY29tbWFuZDoxLGNvbnRleHRtZW51OjEsY29weToxLGN1dDoxLGRibGNsaWNrOjEsRE9NTW91c2VTY3JvbGw6MSxkcmFnOjEsZHJhZ3N0YXJ0OjEsZHJhZ2VudGVyOjEsZHJhZ292ZXI6MSxkcmFnbGVhdmU6MSxkcmFnZW5kOjEsZHJvcDoxLGVycm9yOjEsZm9jdXM6MSxrZXk6MSxrZXlkb3duOjEsa2V5cHJlc3M6MSxrZXl1cDoxLGxvYWQ6MSxtZXNzYWdlOjEsbW91c2Vkb3duOjEsbW91c2VlbnRlcjoxLG1vdXNlbGVhdmU6MSxtb3VzZW1vdmU6MSxtb3VzZW11bHRpd2hlZWw6MSxtb3VzZW91dDoxLG1vdXNlb3ZlcjoxLG1vdXNldXA6MSxtb3VzZXdoZWVsOjEsb3JpZW50YXRpb25jaGFuZ2U6MSxwYXN0ZToxLHJlc2V0OjEscmVzaXplOjEsc2VsZWN0OjEsc2VsZWN0c3RhcnQ6MSxzdWJtaXQ6MSxzY3JvbGw6MSx0ZXh0SW5wdXQ6MSx1bmxvYWQ6MSxpbnZhbGlkOjF9LGUubWl4KHIuRE9NX0VWRU5UUyxlLkVudi5ldnQucGx1Z2lucyksZS5hdWdtZW50KHIsZS5FdmVudFRhcmdldCksZS5taXgoci5wcm90b3R5cGUse3B1cmdlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuRXZlbnQucHVyZ2VFbGVtZW50KHRoaXMuX25vZGUsdCxuKSx0aGlzfX0pLGUubWl4KGUuTm9kZUxpc3QucHJvdG90eXBlLHtfcHJlcEV2dEFyZ3M6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUuQXJyYXkoYXJndW1lbnRzLDAsITApO3JldHVybiBpLmxlbmd0aDwyP2lbMl09dGhpcy5fbm9kZXM6aS5zcGxpY2UoMiwwLHRoaXMuX25vZGVzKSxpWzNdPXJ8fHRoaXMsaX0sb246ZnVuY3Rpb24odCxuLHIpe3JldHVybiBlLm9uLmFwcGx5KGUsdGhpcy5fcHJlcEV2dEFyZ3MuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sb25jZTpmdW5jdGlvbih0LG4scil7cmV0dXJuIGUub25jZS5hcHBseShlLHRoaXMuX3ByZXBFdnRBcmdzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGFmdGVyOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gZS5hZnRlci5hcHBseShlLHRoaXMuX3ByZXBFdnRBcmdzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LG9uY2VBZnRlcjpmdW5jdGlvbih0LG4scil7cmV0dXJuIGUub25jZUFmdGVyLmFwcGx5KGUsdGhpcy5fcHJlcEV2dEFyZ3MuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19KSxzLmltcG9ydE1ldGhvZChlLk5vZGUucHJvdG90eXBlLFsiZGV0YWNoIiwiZGV0YWNoQWxsIl0pLGUubWl4KGUuTm9kZS5BVFRSUyx7b2Zmc2V0SGVpZ2h0OntzZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLnNldEhlaWdodCh0aGlzLl9ub2RlLHQpLHR9LGdldHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlLm9mZnNldEhlaWdodH19LG9mZnNldFdpZHRoOntzZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLnNldFdpZHRoKHRoaXMuX25vZGUsdCksdH0sZ2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGUub2Zmc2V0V2lkdGh9fX0pLGUubWl4KGUuTm9kZS5wcm90b3R5cGUse3NpemVUbzpmdW5jdGlvbih0LG4pe3ZhciByO2FyZ3VtZW50cy5sZW5ndGg8MiYmKHI9ZS5vbmUodCksdD1yLmdldCgib2Zmc2V0V2lkdGgiKSxuPXIuZ2V0KCJvZmZzZXRIZWlnaHQiKSksdGhpcy5zZXRBdHRycyh7b2Zmc2V0V2lkdGg6dCxvZmZzZXRIZWlnaHQ6bn0pfX0pLGUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnQuaGFzQXR0cmlidXRlfHwoZS5Ob2RlLnByb3RvdHlwZS5oYXNBdHRyaWJ1dGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0idmFsdWUiJiZ0aGlzLmdldCgidmFsdWUiKSE9PSIiPyEwOiEhdGhpcy5fbm9kZS5hdHRyaWJ1dGVzW2VdJiYhIXRoaXMuX25vZGUuYXR0cmlidXRlc1tlXS5zcGVjaWZpZWR9KSxlLk5vZGUucHJvdG90eXBlLmZvY3VzPWZ1bmN0aW9uKCl7dHJ5e3RoaXMuX25vZGUuZm9jdXMoKX1jYXRjaChlKXt9cmV0dXJuIHRoaXN9LGUuTm9kZS5BVFRSUy50eXBlPXtzZXR0ZXI6ZnVuY3Rpb24oZSl7aWYoZT09PSJoaWRkZW4iKXRyeXt0aGlzLl9ub2RlLnR5cGU9ImhpZGRlbiJ9Y2F0Y2godCl7dGhpcy5fbm9kZS5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLl9pbnB1dFR5cGU9ImhpZGRlbiJ9ZWxzZSB0cnl7dGhpcy5fbm9kZS50eXBlPWV9Y2F0Y2godCl7fXJldHVybiBlfSxnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5wdXRUeXBlfHx0aGlzLl9ub2RlLnR5cGV9LF9ieXBhc3NQcm94eTohMH0sZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbGVtZW50cy5ub2RlVHlwZSYmKGUuTm9kZS5BVFRSUy5lbGVtZW50cz17Z2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWxsKCJpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbiwgc2VsZWN0Iil9fSksZS5taXgoZS5Ob2RlLnByb3RvdHlwZSx7X2luaXREYXRhOmZ1bmN0aW9uKCl7Il9kYXRhImluIHRoaXN8fCh0aGlzLl9kYXRhPXt9KX0sZ2V0RGF0YTpmdW5jdGlvbih0KXt0aGlzLl9pbml0RGF0YSgpO3ZhciBuPXRoaXMuX2RhdGEscj1uO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QgaW4gbj9yPW5bdF06cj10aGlzLl9nZXREYXRhQXR0cmlidXRlKHQpOnR5cGVvZiBuPT0ib2JqZWN0IiYmbiE9PW51bGwmJihyPXt9LGUuT2JqZWN0LmVhY2gobixmdW5jdGlvbihlLHQpe3JbdF09ZX0pLHI9dGhpcy5fZ2V0RGF0YUF0dHJpYnV0ZXMocikpLHJ9LF9nZXREYXRhQXR0cmlidXRlczpmdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PTAsbj10aGlzLl9ub2RlLmF0dHJpYnV0ZXMscj1uLmxlbmd0aCxpPXRoaXMuREFUQV9QUkVGSVgscz1pLmxlbmd0aCxvO3doaWxlKHQ8cilvPW5bdF0ubmFtZSxvLmluZGV4T2YoaSk9PT0wJiYobz1vLnN1YnN0cihzKSxvIGluIGV8fChlW29dPXRoaXMuX2dldERhdGFBdHRyaWJ1dGUobykpKSx0Kz0xO3JldHVybiBlfSxfZ2V0RGF0YUF0dHJpYnV0ZTpmdW5jdGlvbihlKXtlPXRoaXMuREFUQV9QUkVGSVgrZTt2YXIgdD10aGlzLl9ub2RlLG49dC5hdHRyaWJ1dGVzLHI9biYmbltlXSYmbltlXS52YWx1ZTtyZXR1cm4gcn0sc2V0RGF0YTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9pbml0RGF0YSgpLGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLl9kYXRhW2VdPXQ6dGhpcy5fZGF0YT1lLHRoaXN9LGNsZWFyRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4iX2RhdGEiaW4gdGhpcyYmKHR5cGVvZiBlIT0idW5kZWZpbmVkIj9kZWxldGUgdGhpcy5fZGF0YVtlXTpkZWxldGUgdGhpcy5fZGF0YSksdGhpc319KSxlLm1peChlLk5vZGVMaXN0LnByb3RvdHlwZSx7Z2V0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoP1tlXTpbXTtyZXR1cm4gdGhpcy5faW52b2tlKCJnZXREYXRhIix0LCEwKX0sc2V0RGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MT9bZSx0XTpbZV07cmV0dXJuIHRoaXMuX2ludm9rZSgic2V0RGF0YSIsbil9LGNsZWFyRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoP1tlXTpbXTtyZXR1cm4gdGhpcy5faW52b2tlKCJjbGVhckRhdGEiLFtlXSl9fSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImV2ZW50LWJhc2UiLCJub2RlLWNvcmUiLCJkb20tYmFzZSIsImRvbS1zdHlsZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1iYXNlIixmdW5jdGlvbihlLHQpe2UucHVibGlzaCgiZG9tcmVhZHkiLHtmaXJlT25jZTohMCxhc3luYzohMH0pLFlVSS5FbnYuRE9NUmVhZHk/ZS5maXJlKCJkb21yZWFkeSIpOmUuRG8uYmVmb3JlKGZ1bmN0aW9uKCl7ZS5maXJlKCJkb21yZWFkeSIpfSxZVUkuRW52LCJfcmVhZHkiKTt2YXIgbj1lLlVBLHI9e30saT17NjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyNzY6MzMsNjMyNzc6MzQsMjU6OSw2MzI3Mjo0Niw2MzI3MzozNiw2MzI3NTozNX0scz1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gdDt0cnl7dCYmMz09dC5ub2RlVHlwZSYmKHQ9dC5wYXJlbnROb2RlKX1jYXRjaChuKXtyZXR1cm4gbnVsbH1yZXR1cm4gZS5vbmUodCl9LG89ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX2V2ZW50PWUsdGhpcy5fY3VycmVudFRhcmdldD10LHRoaXMuX3dyYXBwZXI9bnx8cix0aGlzLmluaXQoKX07ZS5leHRlbmQobyxPYmplY3Qse2luaXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9ldmVudCx0PXRoaXMuX3dyYXBwZXIub3ZlcnJpZGVzLHI9ZS5wYWdlWCxvPWUucGFnZVksdSxhPXRoaXMuX2N1cnJlbnRUYXJnZXQ7dGhpcy5hbHRLZXk9ZS5hbHRLZXksdGhpcy5jdHJsS2V5PWUuY3RybEtleSx0aGlzLm1ldGFLZXk9ZS5tZXRhS2V5LHRoaXMuc2hpZnRLZXk9ZS5zaGlmdEtleSx0aGlzLnR5cGU9dCYmdC50eXBlfHxlLnR5cGUsdGhpcy5jbGllbnRYPWUuY2xpZW50WCx0aGlzLmNsaWVudFk9ZS5jbGllbnRZLHRoaXMucGFnZVg9cix0aGlzLnBhZ2VZPW8sdT1lLmtleUNvZGV8fGUuY2hhckNvZGUsbi53ZWJraXQmJnUgaW4gaSYmKHU9aVt1XSksdGhpcy5rZXlDb2RlPXUsdGhpcy5jaGFyQ29kZT11LHRoaXMud2hpY2g9ZS53aGljaHx8ZS5jaGFyQ29kZXx8dSx0aGlzLmJ1dHRvbj10aGlzLndoaWNoLHRoaXMudGFyZ2V0PXMoZS50YXJnZXQpLHRoaXMuY3VycmVudFRhcmdldD1zKGEpLHRoaXMucmVsYXRlZFRhcmdldD1zKGUucmVsYXRlZFRhcmdldCk7aWYoZS50eXBlPT0ibW91c2V3aGVlbCJ8fGUudHlwZT09IkRPTU1vdXNlU2Nyb2xsIil0aGlzLndoZWVsRGVsdGE9ZS5kZXRhaWw/ZS5kZXRhaWwqLTE6TWF0aC5yb3VuZChlLndoZWVsRGVsdGEvODApfHwoZS53aGVlbERlbHRhPDA/LTE6MSk7dGhpcy5fdG91Y2gmJnRoaXMuX3RvdWNoKGUsYSx0aGlzLl93cmFwcGVyKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fd3JhcHBlci5zdG9wcGVkPTEsdGhpcy5zdG9wcGVkPTF9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2V2ZW50O2Uuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uP2Uuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk6dGhpcy5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl93cmFwcGVyLnN0b3BwZWQ9Mix0aGlzLnN0b3BwZWQ9Mn0scHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZXZlbnQ7dC5wcmV2ZW50RGVmYXVsdCgpLGUmJih0LnJldHVyblZhbHVlPWUpLHRoaXMuX3dyYXBwZXIucHJldmVudGVkPTEsdGhpcy5wcmV2ZW50ZWQ9MX0saGFsdDpmdW5jdGlvbihlKXtlP3RoaXMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk6dGhpcy5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnByZXZlbnREZWZhdWx0KCl9fSksby5yZXNvbHZlPXMsZS5ET00yRXZlbnRGYWNhZGU9byxlLkRPTUV2ZW50RmFjYWRlPW8sZnVuY3Rpb24oKXtlLkVudi5ldnQuZG9tX3dyYXBwZXJzPXt9LGUuRW52LmV2dC5kb21fbWFwPXt9O3ZhciB0PWUuRW52LmV2dCxuPWUuY29uZmlnLHI9bi53aW4saT1ZVUkuRW52LmFkZCxzPVlVSS5FbnYucmVtb3ZlLG89ZnVuY3Rpb24oKXtZVUkuRW52LndpbmRvd0xvYWRlZD0hMCxlLkV2ZW50Ll9sb2FkKCkscyhyLCJsb2FkIixvKX0sdT1mdW5jdGlvbigpe2UuRXZlbnQuX3VubG9hZCgpfSxhPSJkb21yZWFkeSIsZj0ifnl1aXwyfGNvbXBhdH4iLGw9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0JiZ0eXBlb2YgdCE9InN0cmluZyImJmUuTGFuZy5pc051bWJlcih0Lmxlbmd0aCkmJiF0LnRhZ05hbWUmJiFlLkRPTS5pc1dpbmRvdyh0KX1jYXRjaChuKXtyZXR1cm4hMX19LGM9ZS5DdXN0b21FdmVudC5wcm90b3R5cGUuX2RlbGV0ZSxoPWZ1bmN0aW9uKHQpe3ZhciBuPWMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzLmhhc1N1YnMoKXx8ZS5FdmVudC5fY2xlYW4odGhpcyksbn0scD1mdW5jdGlvbigpe3ZhciBuPSExLG89MCxjPVtdLGQ9dC5kb21fd3JhcHBlcnMsdj1udWxsLG09dC5kb21fbWFwO3JldHVybntQT0xMX1JFVFJZUzoxZTMsUE9MTF9JTlRFUlZBTDo0MCxsYXN0RXJyb3I6bnVsbCxfaW50ZXJ2YWw6bnVsbCxfZHJpOm51bGwsRE9NUmVhZHk6ITEsc3RhcnRJbnRlcnZhbDpmdW5jdGlvbigpe3AuX2ludGVydmFsfHwocC5faW50ZXJ2YWw9c2V0SW50ZXJ2YWwocC5fcG9sbCxwLlBPTExfSU5URVJWQUwpKX0sb25BdmFpbGFibGU6ZnVuY3Rpb24odCxuLHIsaSxzLHUpe3ZhciBhPWUuQXJyYXkodCksZixsO2ZvcihmPTA7ZjxhLmxlbmd0aDtmKz0xKWMucHVzaCh7aWQ6YVtmXSxmbjpuLG9iajpyLG92ZXJyaWRlOmksY2hlY2tSZWFkeTpzLGNvbXBhdDp1fSk7cmV0dXJuIG89dGhpcy5QT0xMX1JFVFJZUyxzZXRUaW1lb3V0KHAuX3BvbGwsMCksbD1uZXcgZS5FdmVudEhhbmRsZSh7X2RlbGV0ZTpmdW5jdGlvbigpe2lmKGwuaGFuZGxlKXtsLmhhbmRsZS5kZXRhY2goKTtyZXR1cm59dmFyIGUsdDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWZvcih0PTA7dDxjLmxlbmd0aDt0KyspYVtlXT09PWNbdF0uaWQmJmMuc3BsaWNlKHQsMSl9fSksbH0sb25Db250ZW50UmVhZHk6ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4gcC5vbkF2YWlsYWJsZShlLHQsbixyLCEwLGkpfSxhdHRhY2g6ZnVuY3Rpb24odCxuLHIsaSl7cmV0dXJuIHAuX2F0dGFjaChlLkFycmF5KGFyZ3VtZW50cywwLCEwKSl9LF9jcmVhdGVXcmFwcGVyOmZ1bmN0aW9uKHQsbixzLG8sdSl7dmFyIGEsZj1lLnN0YW1wKHQpLGw9ImV2ZW50OiIrZituO3JldHVybiExPT09dSYmKGwrPSJuYXRpdmUiKSxzJiYobCs9ImNhcHR1cmUiKSxhPWRbbF0sYXx8KGE9ZS5wdWJsaXNoKGwse3NpbGVudDohMCxidWJibGVzOiExLGVtaXRGYWNhZGU6ITEsY29udGV4dEZuOmZ1bmN0aW9uKCl7cmV0dXJuIG8/YS5lbDooYS5ub2RlUmVmPWEubm9kZVJlZnx8ZS5vbmUoYS5lbCksYS5ub2RlUmVmKX19KSxhLm92ZXJyaWRlcz17fSxhLmVsPXQsYS5rZXk9bCxhLmRvbWtleT1mLGEudHlwZT1uLGEuZm49ZnVuY3Rpb24oZSl7YS5maXJlKHAuZ2V0RXZlbnQoZSx0LG98fCExPT09dSkpfSxhLmNhcHR1cmU9cyx0PT1yJiZuPT0ibG9hZCImJihhLmZpcmVPbmNlPSEwLHY9bCksYS5fZGVsZXRlPWgsZFtsXT1hLG1bZl09bVtmXXx8e30sbVtmXVtsXT1hLGkodCxuLGEuZm4scykpLGF9LF9hdHRhY2g6ZnVuY3Rpb24odCxuKXt2YXIgaSxzLG8sdSxhLGM9ITEsaCxkPXRbMF0sdj10WzFdLG09dFsyXXx8cixnPW4mJm4uZmFjYWRlLHk9biYmbi5jYXB0dXJlLGI9biYmbi5vdmVycmlkZXM7dFt0Lmxlbmd0aC0xXT09PWYmJihpPSEwKTtpZighdnx8IXYuY2FsbClyZXR1cm4hMTtpZihsKG0pKXJldHVybiBzPVtdLGUuZWFjaChtLGZ1bmN0aW9uKGUscil7dFsyXT1lLHMucHVzaChwLl9hdHRhY2godC5zbGljZSgpLG4pKX0pLG5ldyBlLkV2ZW50SGFuZGxlKHMpO2lmKGUuTGFuZy5pc1N0cmluZyhtKSl7aWYoaSlvPWUuRE9NLmJ5SWQobSk7ZWxzZXtvPWUuU2VsZWN0b3IucXVlcnkobSk7c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDA6bz1udWxsO2JyZWFrO2Nhc2UgMTpvPW9bMF07YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdFsyXT1vLHAuX2F0dGFjaCh0LG4pfX1pZighbylyZXR1cm4gaD1wLm9uQXZhaWxhYmxlKG0sZnVuY3Rpb24oKXtoLmhhbmRsZT1wLl9hdHRhY2godCxuKX0scCwhMCwhMSxpKSxoO209b31yZXR1cm4gbT8oZS5Ob2RlJiZlLmluc3RhbmNlT2YobSxlLk5vZGUpJiYobT1lLk5vZGUuZ2V0RE9NTm9kZShtKSksdT1wLl9jcmVhdGVXcmFwcGVyKG0sZCx5LGksZyksYiYmZS5taXgodS5vdmVycmlkZXMsYiksbT09ciYmZD09ImxvYWQiJiZZVUkuRW52LndpbmRvd0xvYWRlZCYmKGM9ITApLGkmJnQucG9wKCksYT10WzNdLGg9dS5fb24odixhLHQubGVuZ3RoPjQ/dC5zbGljZSg0KTpudWxsKSxjJiZ1LmZpcmUoKSxoKTohMX0sZGV0YWNoOmZ1bmN0aW9uKHQsbixyLGkpe3ZhciBzPWUuQXJyYXkoYXJndW1lbnRzLDAsITApLG8sdSxhLGMsaCx2O3Nbcy5sZW5ndGgtMV09PT1mJiYobz0hMCk7aWYodCYmdC5kZXRhY2gpcmV0dXJuIHQuZGV0YWNoKCk7dHlwZW9mIHI9PSJzdHJpbmciJiYobz9yPWUuRE9NLmJ5SWQocik6KHI9ZS5TZWxlY3Rvci5xdWVyeShyKSx1PXIubGVuZ3RoLHU8MT9yPW51bGw6dT09MSYmKHI9clswXSkpKTtpZighcilyZXR1cm4hMTtpZihyLmRldGFjaClyZXR1cm4gcy5zcGxpY2UoMiwxKSxyLmRldGFjaC5hcHBseShyLHMpO2lmKGwocikpe2E9ITA7Zm9yKGM9MCx1PXIubGVuZ3RoO2M8dTsrK2Mpc1syXT1yW2NdLGE9ZS5FdmVudC5kZXRhY2guYXBwbHkoZS5FdmVudCxzKSYmYTtyZXR1cm4gYX1yZXR1cm4hdHx8IW58fCFuLmNhbGw/cC5wdXJnZUVsZW1lbnQociwhMSx0KTooaD0iZXZlbnQ6IitlLnN0YW1wKHIpK3Qsdj1kW2hdLHY/di5kZXRhY2gobik6ITEpfSxnZXRFdmVudDpmdW5jdGlvbih0LG4saSl7dmFyIHM9dHx8ci5ldmVudDtyZXR1cm4gaT9zOm5ldyBlLkRPTUV2ZW50RmFjYWRlKHMsbixkWyJldmVudDoiK2Uuc3RhbXAobikrdC50eXBlXSl9LGdlbmVyYXRlSWQ6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLmdlbmVyYXRlSUQodCl9LF9pc1ZhbGlkQ29sbGVjdGlvbjpsLF9sb2FkOmZ1bmN0aW9uKHQpe258fChuPSEwLGUuZmlyZSYmZS5maXJlKGEpLHAuX3BvbGwoKSl9LF9wb2xsOmZ1bmN0aW9uKCl7aWYocC5sb2NrZWQpcmV0dXJuO2lmKGUuVUEuaWUmJiFZVUkuRW52LkRPTVJlYWR5KXtwLnN0YXJ0SW50ZXJ2YWwoKTtyZXR1cm59cC5sb2NrZWQ9ITA7dmFyIHQscixpLHMsdSxhLGY9IW47Znx8KGY9bz4wKSx1PVtdLGE9ZnVuY3Rpb24odCxuKXt2YXIgcixpPW4ub3ZlcnJpZGU7dHJ5e24uY29tcGF0PyhuLm92ZXJyaWRlP2k9PT0hMD9yPW4ub2JqOnI9aTpyPXQsbi5mbi5jYWxsKHIsbi5vYmopKToocj1uLm9ianx8ZS5vbmUodCksbi5mbi5hcHBseShyLGUuTGFuZy5pc0FycmF5KGkpP2k6W10pKX1jYXRjaChzKXt9fTtmb3IodD0wLHI9Yy5sZW5ndGg7dDxyOysrdClpPWNbdF0saSYmIWkuY2hlY2tSZWFkeSYmKHM9aS5jb21wYXQ/ZS5ET00uYnlJZChpLmlkKTplLlNlbGVjdG9yLnF1ZXJ5KGkuaWQsbnVsbCwhMCkscz8oYShzLGkpLGNbdF09bnVsbCk6dS5wdXNoKGkpKTtmb3IodD0wLHI9Yy5sZW5ndGg7dDxyOysrdCl7aT1jW3RdO2lmKGkmJmkuY2hlY2tSZWFkeSl7cz1pLmNvbXBhdD9lLkRPTS5ieUlkKGkuaWQpOmUuU2VsZWN0b3IucXVlcnkoaS5pZCxudWxsLCEwKTtpZihzKXtpZihufHxzLmdldCYmcy5nZXQoIm5leHRTaWJsaW5nIil8fHMubmV4dFNpYmxpbmcpYShzLGkpLGNbdF09bnVsbH1lbHNlIHUucHVzaChpKX19bz11Lmxlbmd0aD09PTA/MDpvLTEsZj9wLnN0YXJ0SW50ZXJ2YWwoKTooY2xlYXJJbnRlcnZhbChwLl9pbnRlcnZhbCkscC5faW50ZXJ2YWw9bnVsbCkscC5sb2NrZWQ9ITE7cmV0dXJufSxwdXJnZUVsZW1lbnQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUuTGFuZy5pc1N0cmluZyh0KT9lLlNlbGVjdG9yLnF1ZXJ5KHQsbnVsbCwhMCk6dCxzPXAuZ2V0TGlzdGVuZXJzKGksciksbyx1LGEsZjtpZihuJiZpKXtzPXN8fFtdLGE9ZS5TZWxlY3Rvci5xdWVyeSgiKiIsaSksdT1hLmxlbmd0aDtmb3Iobz0wO288dTsrK28pZj1wLmdldExpc3RlbmVycyhhW29dLHIpLGYmJihzPXMuY29uY2F0KGYpKX1pZihzKWZvcihvPTAsdT1zLmxlbmd0aDtvPHU7KytvKXNbb10uZGV0YWNoQWxsKCl9CixfY2xlYW46ZnVuY3Rpb24odCl7dmFyIG49dC5rZXkscj10LmRvbWtleTtzKHQuZWwsdC50eXBlLHQuZm4sdC5jYXB0dXJlKSxkZWxldGUgZFtuXSxkZWxldGUgZS5feXVpZXZ0LmV2ZW50c1tuXSxtW3JdJiYoZGVsZXRlIG1bcl1bbl0sZS5PYmplY3Quc2l6ZShtW3JdKXx8ZGVsZXRlIG1bcl0pfSxnZXRMaXN0ZW5lcnM6ZnVuY3Rpb24obixyKXt2YXIgaT1lLnN0YW1wKG4sITApLHM9bVtpXSxvPVtdLHU9cj8iZXZlbnQ6IitpK3I6bnVsbCxhPXQucGx1Z2lucztyZXR1cm4gcz8odT8oYVtyXSYmYVtyXS5ldmVudERlZiYmKHUrPSJfc3ludGgiKSxzW3VdJiZvLnB1c2goc1t1XSksdSs9Im5hdGl2ZSIsc1t1XSYmby5wdXNoKHNbdV0pKTplLmVhY2gocyxmdW5jdGlvbihlLHQpe28ucHVzaChlKX0pLG8ubGVuZ3RoP286bnVsbCk6bnVsbH0sX3VubG9hZDpmdW5jdGlvbih0KXtlLmVhY2goZCxmdW5jdGlvbihlLG4pe2UudHlwZT09InVubG9hZCImJmUuZmlyZSh0KSxlLmRldGFjaEFsbCgpfSkscyhyLCJ1bmxvYWQiLHUpfSxuYXRpdmVBZGQ6aSxuYXRpdmVSZW1vdmU6c319KCk7ZS5FdmVudD1wLG4uaW5qZWN0ZWR8fFlVSS5FbnYud2luZG93TG9hZGVkP28oKTppKHIsImxvYWQiLG8pO2lmKGUuVUEuaWUpe2Uub24oYSxwLl9wb2xsKTtpZihlLlVBLmllPDcpdHJ5e2kociwidW5sb2FkIix1KX1jYXRjaChkKXt9fXAuQ3VzdG9tPWUuQ3VzdG9tRXZlbnQscC5TdWJzY3JpYmVyPWUuU3Vic2NyaWJlcixwLlRhcmdldD1lLkV2ZW50VGFyZ2V0LHAuSGFuZGxlPWUuRXZlbnRIYW5kbGUscC5GYWNhZGU9ZS5FdmVudEZhY2FkZSxwLl9wb2xsKCl9KCksZS5FbnYuZXZ0LnBsdWdpbnMuYXZhaWxhYmxlPXtvbjpmdW5jdGlvbih0LG4scixpKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjQ/ZS5BcnJheShhcmd1bWVudHMsNCwhMCk6bnVsbDtyZXR1cm4gZS5FdmVudC5vbkF2YWlsYWJsZS5jYWxsKGUuRXZlbnQscixuLGkscyl9fSxlLkVudi5ldnQucGx1Z2lucy5jb250ZW50cmVhZHk9e29uOmZ1bmN0aW9uKHQsbixyLGkpe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGg+ND9lLkFycmF5KGFyZ3VtZW50cyw0LCEwKTpudWxsO3JldHVybiBlLkV2ZW50Lm9uQ29udGVudFJlYWR5LmNhbGwoZS5FdmVudCxyLG4saSxzKX19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgooZnVuY3Rpb24oKXt2YXIgZSx0PVlVSS5FbnYsbj1ZVUkuY29uZmlnLHI9bi5kb2MsaT1yJiZyLmRvY3VtZW50RWxlbWVudCxzPSJvbnJlYWR5c3RhdGVjaGFuZ2UiLG89bi5wb2xsSW50ZXJ2YWx8fDQwO2kuZG9TY3JvbGwmJiF0Ll9pZXJlYWR5JiYodC5faWVyZWFkeT1mdW5jdGlvbigpe3QuX3JlYWR5KCl9LAovKiEgRE9NUmVhZHk6IGJhc2VkIG9uIHdvcmsgYnk6IERlYW4gRWR3YXJkcy9Kb2huIFJlc2lnL01hdHRoaWFzIE1pbGxlci9EaWVnbyBQZXJpbmkgKi8Kc2VsZiE9PXNlbGYudG9wPyhlPWZ1bmN0aW9uKCl7ci5yZWFkeVN0YXRlPT0iY29tcGxldGUiJiYodC5yZW1vdmUocixzLGUpLHQuaWVyZWFkeSgpKX0sdC5hZGQocixzLGUpKTp0Ll9kcmk9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0cnl7aS5kb1Njcm9sbCgibGVmdCIpLGNsZWFySW50ZXJ2YWwodC5fZHJpKSx0Ll9kcmk9bnVsbCx0Ll9pZXJlYWR5KCl9Y2F0Y2goZSl7fX0sbykpfSkoKSxZVUkuYWRkKCJldmVudC1iYXNlLWllIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtlLkRPTTJFdmVudEZhY2FkZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcih0KXt2YXIgbj1lLmNvbmZpZy5kb2MuY3JlYXRlRXZlbnRPYmplY3QodCksaT1yLnByb3RvdHlwZTtyZXR1cm4gbi5oYXNPd25Qcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiEwfSxuLmluaXQ9aS5pbml0LG4uaGFsdD1pLmhhbHQsbi5wcmV2ZW50RGVmYXVsdD1pLnByZXZlbnREZWZhdWx0LG4uc3RvcFByb3BhZ2F0aW9uPWkuc3RvcFByb3BhZ2F0aW9uLG4uc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uPWkuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uLGUuRE9NMkV2ZW50RmFjYWRlLmFwcGx5KG4sYXJndW1lbnRzKSxufXZhciBpPWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmltcGxlbWVudGF0aW9uLHM9ZS5jb25maWcubGF6eUV2ZW50RmFjYWRlLG89ezA6MSw0OjIsMjozfSx1PXttb3VzZW91dDoidG9FbGVtZW50Iixtb3VzZW92ZXI6ImZyb21FbGVtZW50In0sYT1lLkRPTTJFdmVudEZhY2FkZS5yZXNvbHZlLGY9e2luaXQ6ZnVuY3Rpb24oKXtuLnN1cGVyY2xhc3MuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHQ9dGhpcy5fZXZlbnQscixpLHMsdSxmLGw7dGhpcy50YXJnZXQ9YSh0LnNyY0VsZW1lbnQpLCJjbGllbnRYImluIHQmJiFyJiYwIT09ciYmKHI9dC5jbGllbnRYLGk9dC5jbGllbnRZLHM9ZS5jb25maWcuZG9jLHU9cy5ib2R5LGY9cy5kb2N1bWVudEVsZW1lbnQscis9Zi5zY3JvbGxMZWZ0fHx1JiZ1LnNjcm9sbExlZnR8fDAsaSs9Zi5zY3JvbGxUb3B8fHUmJnUuc2Nyb2xsVG9wfHwwLHRoaXMucGFnZVg9cix0aGlzLnBhZ2VZPWkpLHQudHlwZT09Im1vdXNlb3V0Ij9sPXQudG9FbGVtZW50OnQudHlwZT09Im1vdXNlb3ZlciImJihsPXQuZnJvbUVsZW1lbnQpLHRoaXMucmVsYXRlZFRhcmdldD1hKGx8fHQucmVsYXRlZFRhcmdldCksdGhpcy53aGljaD10aGlzLmJ1dHRvbj10LmtleUNvZGV8fG9bdC5idXR0b25dfHx0LmJ1dHRvbn0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQuY2FuY2VsQnViYmxlPSEwLHRoaXMuX3dyYXBwZXIuc3RvcHBlZD0xLHRoaXMuc3RvcHBlZD0xfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX3dyYXBwZXIuc3RvcHBlZD0yLHRoaXMuc3RvcHBlZD0yfSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbihlKXt0aGlzLl9ldmVudC5yZXR1cm5WYWx1ZT1lfHwhMSx0aGlzLl93cmFwcGVyLnByZXZlbnRlZD0xLHRoaXMucHJldmVudGVkPTF9fTtlLmV4dGVuZChuLGUuRE9NMkV2ZW50RmFjYWRlLGYpLGUuZXh0ZW5kKHIsZS5ET00yRXZlbnRGYWNhZGUsZiksci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2V2ZW50LHQ9dGhpcy5fd3JhcHBlci5vdmVycmlkZXMsbj1yLl9kZWZpbmUsaT1yLl9sYXp5UHJvcGVydGllcyxzO3RoaXMuYWx0S2V5PWUuYWx0S2V5LHRoaXMuY3RybEtleT1lLmN0cmxLZXksdGhpcy5tZXRhS2V5PWUubWV0YUtleSx0aGlzLnNoaWZ0S2V5PWUuc2hpZnRLZXksdGhpcy50eXBlPXQmJnQudHlwZXx8ZS50eXBlLHRoaXMuY2xpZW50WD1lLmNsaWVudFgsdGhpcy5jbGllbnRZPWUuY2xpZW50WSx0aGlzLmtleUNvZGU9dGhpcy5jaGFyQ29kZT1lLmtleUNvZGUsdGhpcy53aGljaD10aGlzLmJ1dHRvbj1lLmtleUNvZGV8fG9bZS5idXR0b25dfHxlLmJ1dHRvbjtmb3IocyBpbiBpKWkuaGFzT3duUHJvcGVydHkocykmJm4odGhpcyxzLGlbc10pO3RoaXMuX3RvdWNoJiZ0aGlzLl90b3VjaChlLHRoaXMuX2N1cnJlbnRUYXJnZXQsdGhpcy5fd3JhcHBlcil9LHIuX2xhenlQcm9wZXJ0aWVzPXt0YXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLl9ldmVudC5zcmNFbGVtZW50KX0scmVsYXRlZFRhcmdldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2V2ZW50LHQ9dVtlLnR5cGVdfHwicmVsYXRlZFRhcmdldCI7cmV0dXJuIGEoZVt0XXx8ZS5yZWxhdGVkVGFyZ2V0KX0sY3VycmVudFRhcmdldDpmdW5jdGlvbigpe3JldHVybiBhKHRoaXMuX2N1cnJlbnRUYXJnZXQpfSx3aGVlbERlbHRhOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fZXZlbnQ7aWYoZS50eXBlPT09Im1vdXNld2hlZWwifHxlLnR5cGU9PT0iRE9NTW91c2VTY3JvbGwiKXJldHVybiBlLmRldGFpbD9lLmRldGFpbCotMTpNYXRoLnJvdW5kKGUud2hlZWxEZWx0YS84MCl8fChlLndoZWVsRGVsdGE8MD8tMToxKX0scGFnZVg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9ldmVudCxuPXQucGFnZVgscixpLHM7cmV0dXJuIG49PT11bmRlZmluZWQmJihyPWUuY29uZmlnLmRvYyxpPXIuYm9keSYmci5ib2R5LnNjcm9sbExlZnQscz1yLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LG49dC5jbGllbnRYKyhzfHxpfHwwKSksbn0scGFnZVk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9ldmVudCxuPXQucGFnZVkscixpLHM7cmV0dXJuIG49PT11bmRlZmluZWQmJihyPWUuY29uZmlnLmRvYyxpPXIuYm9keSYmci5ib2R5LnNjcm9sbFRvcCxzPXIuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCxuPXQuY2xpZW50WSsoc3x8aXx8MCkpLG59fSxyLl9kZWZpbmU9ZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIocil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD9yOm4uY2FsbCh0aGlzKTtyZXR1cm4gZGVsZXRlIGVbdF0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6aSxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KSxpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpyLHNldDpyLGNvbmZpZ3VyYWJsZTohMH0pfTtpZihpJiYhaS5oYXNGZWF0dXJlKCJFdmVudHMiLCIyLjAiKSl7aWYocyl0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUuY29uZmlnLmRvYy5jcmVhdGVFdmVudE9iamVjdCgpLCJ6Iix7fSl9Y2F0Y2gobCl7cz0hMX1lLkRPTUV2ZW50RmFjYWRlPXM/cjpufX0sIjMuMTcuMiIse3JlcXVpcmVzOlsibm9kZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInBsdWdpbmhvc3QtYmFzZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKCl7dGhpcy5fcGx1Z2lucz17fX12YXIgbj1lLkxhbmc7ci5wcm90b3R5cGU9e3BsdWc6ZnVuY3Rpb24oZSx0KXt2YXIgcixpLHM7aWYobi5pc0FycmF5KGUpKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7cisrKXRoaXMucGx1ZyhlW3JdKTtlbHNlIGUmJiFuLmlzRnVuY3Rpb24oZSkmJih0PWUuY2ZnLGU9ZS5mbiksZSYmZS5OUyYmKHM9ZS5OUyx0PXR8fHt9LHQuaG9zdD10aGlzLHRoaXMuaGFzUGx1Z2luKHMpP3RoaXNbc10uc2V0QXR0cnMmJnRoaXNbc10uc2V0QXR0cnModCk6KHRoaXNbc109bmV3IGUodCksdGhpcy5fcGx1Z2luc1tzXT1lKSk7cmV0dXJuIHRoaXN9LHVucGx1ZzpmdW5jdGlvbihlKXt2YXIgdD1lLHI9dGhpcy5fcGx1Z2lucztpZihlKW4uaXNGdW5jdGlvbihlKSYmKHQ9ZS5OUyx0JiYoIXJbdF18fHJbdF0hPT1lKSYmKHQ9bnVsbCkpLHQmJih0aGlzW3RdJiYodGhpc1t0XS5kZXN0cm95JiZ0aGlzW3RdLmRlc3Ryb3koKSxkZWxldGUgdGhpc1t0XSksclt0XSYmZGVsZXRlIHJbdF0pO2Vsc2UgZm9yKHQgaW4gdGhpcy5fcGx1Z2lucyl0aGlzLl9wbHVnaW5zLmhhc093blByb3BlcnR5KHQpJiZ0aGlzLnVucGx1Zyh0KTtyZXR1cm4gdGhpc30saGFzUGx1Z2luOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wbHVnaW5zW2VdJiZ0aGlzW2VdfSxfaW5pdFBsdWdpbnM6ZnVuY3Rpb24oZSl7dGhpcy5fcGx1Z2lucz10aGlzLl9wbHVnaW5zfHx7fSx0aGlzLl9pbml0Q29uZmlnUGx1Z2lucyYmdGhpcy5faW5pdENvbmZpZ1BsdWdpbnMoZSl9LF9kZXN0cm95UGx1Z2luczpmdW5jdGlvbigpe3RoaXMudW5wbHVnKCl9fSxlLm5hbWVzcGFjZSgiUGx1Z2luIikuSG9zdD1yfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJwbHVnaW5ob3N0LWNvbmZpZyIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLlBsdWdpbi5Ib3N0LHI9ZS5MYW5nO24ucHJvdG90eXBlLl9pbml0Q29uZmlnUGx1Z2lucz1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRDbGFzc2VzP3RoaXMuX2dldENsYXNzZXMoKTpbdGhpcy5jb25zdHJ1Y3Rvcl0scj1bXSxpPXt9LHMsbyx1LGEsZjtmb3Iobz1uLmxlbmd0aC0xO28+PTA7by0tKXM9bltvXSxhPXMuX1VOUExVRyxhJiZlLm1peChpLGEsITApLHU9cy5fUExVRyx1JiZlLm1peChyLHUsITApO2ZvcihmIGluIHIpci5oYXNPd25Qcm9wZXJ0eShmKSYmKGlbZl18fHRoaXMucGx1ZyhyW2ZdKSk7dCYmdC5wbHVnaW5zJiZ0aGlzLnBsdWcodC5wbHVnaW5zKX0sbi5wbHVnPWZ1bmN0aW9uKHQsbixpKXt2YXIgcyxvLHUsYTtpZih0IT09ZS5CYXNlKXt0Ll9QTFVHPXQuX1BMVUd8fHt9LHIuaXNBcnJheShuKXx8KGkmJihuPXtmbjpuLGNmZzppfSksbj1bbl0pO2ZvcihvPTAsdT1uLmxlbmd0aDtvPHU7bysrKXM9bltvXSxhPXMuTkFNRXx8cy5mbi5OQU1FLHQuX1BMVUdbYV09c319LG4udW5wbHVnPWZ1bmN0aW9uKHQsbil7dmFyIGkscyxvLHU7aWYodCE9PWUuQmFzZSl7dC5fVU5QTFVHPXQuX1VOUExVR3x8e30sci5pc0FycmF5KG4pfHwobj1bbl0pO2ZvcihzPTAsbz1uLmxlbmd0aDtzPG87cysrKWk9bltzXSx1PWkuTkFNRSx0Ll9QTFVHW3VdP2RlbGV0ZSB0Ll9QTFVHW3VdOnQuX1VOUExVR1t1XT1pfX19LCIzLjE3LjIiLHtyZXF1aXJlczpbInBsdWdpbmhvc3QtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1kZWxlZ2F0ZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBmKHQscix1LGwpe3ZhciBjPW4oYXJndW1lbnRzLDAsITApLGg9aSh1KT91Om51bGwscCxkLHYsbSxnLHksYix3LEU7aWYocyh0KSl7dz1bXTtpZihvKHQpKWZvcih5PTAsYj10Lmxlbmd0aDt5PGI7Kyt5KWNbMF09dFt5XSx3LnB1c2goZS5kZWxlZ2F0ZS5hcHBseShlLGMpKTtlbHNle2MudW5zaGlmdChudWxsKTtmb3IoeSBpbiB0KXQuaGFzT3duUHJvcGVydHkoeSkmJihjWzBdPXksY1sxXT10W3ldLHcucHVzaChlLmRlbGVnYXRlLmFwcGx5KGUsYykpKX1yZXR1cm4gbmV3IGUuRXZlbnRIYW5kbGUodyl9cD10LnNwbGl0KC9cfC8pLHAubGVuZ3RoPjEmJihnPXAuc2hpZnQoKSxjWzBdPXQ9cC5zaGlmdCgpKSxkPWUuTm9kZS5ET01fRVZFTlRTW3RdLHMoZCkmJmQuZGVsZWdhdGUmJihFPWQuZGVsZWdhdGUuYXBwbHkoZCxhcmd1bWVudHMpKTtpZighRSl7aWYoIXR8fCFyfHwhdXx8IWwpcmV0dXJuO3Y9aD9lLlNlbGVjdG9yLnF1ZXJ5KGgsbnVsbCwhMCk6dSwhdiYmaSh1KSYmKEU9ZS5vbigiYXZhaWxhYmxlIixmdW5jdGlvbigpe2UubWl4KEUsZS5kZWxlZ2F0ZS5hcHBseShlLGMpLCEwKX0sdSkpLCFFJiZ2JiYoYy5zcGxpY2UoMiwyLHYpLEU9ZS5FdmVudC5fYXR0YWNoKGMse2ZhY2FkZTohMX0pLEUuc3ViLmZpbHRlcj1sLEUuc3ViLl9ub3RpZnk9Zi5ub3RpZnlTdWIpfXJldHVybiBFJiZnJiYobT1hW2ddfHwoYVtnXT17fSksbT1tW3RdfHwobVt0XT1bXSksbS5wdXNoKEUpKSxFfXZhciBuPWUuQXJyYXkscj1lLkxhbmcsaT1yLmlzU3RyaW5nLHM9ci5pc09iamVjdCxvPXIuaXNBcnJheSx1PWUuU2VsZWN0b3IudGVzdCxhPWUuRW52LmV2dC5oYW5kbGVzO2Yubm90aWZ5U3ViPWZ1bmN0aW9uKHQscixpKXtyPXIuc2xpY2UoKSx0aGlzLmFyZ3MmJnIucHVzaC5hcHBseShyLHRoaXMuYXJncyk7dmFyIHM9Zi5fYXBwbHlGaWx0ZXIodGhpcy5maWx0ZXIscixpKSxvLHUsYSxsO2lmKHMpe3M9bihzKSxvPXJbMF09bmV3IGUuRE9NRXZlbnRGYWNhZGUoclswXSxpLmVsLGkpLG8uY29udGFpbmVyPWUub25lKGkuZWwpO2Zvcih1PTAsYT1zLmxlbmd0aDt1PGEmJiFvLnN0b3BwZWQ7Kyt1KXtvLmN1cnJlbnRUYXJnZXQ9ZS5vbmUoc1t1XSksbD10aGlzLmZuLmFwcGx5KHRoaXMuY29udGV4dHx8by5jdXJyZW50VGFyZ2V0LHIpO2lmKGw9PT0hMSlicmVha31yZXR1cm4gbH19LGYuY29tcGlsZUZpbHRlcj1lLmNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gdSh0Ll9ub2RlLGUsbi5jdXJyZW50VGFyZ2V0PT09bi50YXJnZXQ/bnVsbDpuLmN1cnJlbnRUYXJnZXQuX25vZGUpfX0pLGYuX2Rpc2FibGVkUkU9L14oPzpidXR0b258aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaSxmLl9hcHBseUZpbHRlcj1mdW5jdGlvbih0LG4scil7dmFyIHM9blswXSxvPXIuZWwsYT1zLnRhcmdldHx8cy5zcmNFbGVtZW50LGw9W10sYz0hMTthLm5vZGVUeXBlPT09MyYmKGE9YS5wYXJlbnROb2RlKTtpZihhLmRpc2FibGVkJiZmLl9kaXNhYmxlZFJFLnRlc3QoYS5ub2RlTmFtZSkpcmV0dXJuIGw7bi51bnNoaWZ0KGEpO2lmKGkodCkpd2hpbGUoYSl7Yz1hPT09byx1KGEsdCxjP251bGw6bykmJmwucHVzaChhKTtpZihjKWJyZWFrO2E9YS5wYXJlbnROb2RlfWVsc2V7blswXT1lLm9uZShhKSxuWzFdPW5ldyBlLkRPTUV2ZW50RmFjYWRlKHMsbyxyKTt3aGlsZShhKXt0LmFwcGx5KG5bMF0sbikmJmwucHVzaChhKTtpZihhPT09bylicmVhazthPWEucGFyZW50Tm9kZSxuWzBdPWUub25lKGEpfW5bMV09c31yZXR1cm4gbC5sZW5ndGg8PTEmJihsPWxbMF0pLG4uc2hpZnQoKSxsfSxlLmRlbGVnYXRlPWUuRXZlbnQuZGVsZWdhdGU9Zn0sIjMuMTcuMiIse3JlcXVpcmVzOlsibm9kZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtZXZlbnQtZGVsZWdhdGUiLGZ1bmN0aW9uKGUsdCl7ZS5Ob2RlLnByb3RvdHlwZS5kZWxlZ2F0ZT1mdW5jdGlvbih0KXt2YXIgbj1lLkFycmF5KGFyZ3VtZW50cywwLCEwKSxyPWUuTGFuZy5pc09iamVjdCh0KSYmIWUuTGFuZy5pc0FycmF5KHQpPzE6MjtyZXR1cm4gbi5zcGxpY2UociwwLHRoaXMuX25vZGUpLGUuZGVsZWdhdGUuYXBwbHkoZSxuKX19LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWRlbGVnYXRlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtcGx1Z2luaG9zdCIsZnVuY3Rpb24oZSx0KXtlLk5vZGUucGx1Zz1mdW5jdGlvbigpe3ZhciB0PWUuQXJyYXkoYXJndW1lbnRzKTtyZXR1cm4gdC51bnNoaWZ0KGUuTm9kZSksZS5QbHVnaW4uSG9zdC5wbHVnLmFwcGx5KGUuQmFzZSx0KSxlLk5vZGV9LGUuTm9kZS51bnBsdWc9ZnVuY3Rpb24oKXt2YXIgdD1lLkFycmF5KGFyZ3VtZW50cyk7cmV0dXJuIHQudW5zaGlmdChlLk5vZGUpLGUuUGx1Z2luLkhvc3QudW5wbHVnLmFwcGx5KGUuQmFzZSx0KSxlLk5vZGV9LGUubWl4KGUuTm9kZSxlLlBsdWdpbi5Ib3N0LCExLG51bGwsMSksZS5PYmplY3QuZWFjaChlLk5vZGUuX2luc3RhbmNlcyxmdW5jdGlvbih0KXtlLlBsdWdpbi5Ib3N0LmFwcGx5KHQpfSksZS5Ob2RlTGlzdC5wcm90b3R5cGUucGx1Zz1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztyZXR1cm4gZS5Ob2RlTGlzdC5lYWNoKHRoaXMsZnVuY3Rpb24obil7ZS5Ob2RlLnByb3RvdHlwZS5wbHVnLmFwcGx5KGUub25lKG4pLHQpfSksdGhpc30sZS5Ob2RlTGlzdC5wcm90b3R5cGUudW5wbHVnPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiBlLk5vZGVMaXN0LmVhY2godGhpcyxmdW5jdGlvbihuKXtlLk5vZGUucHJvdG90eXBlLnVucGx1Zy5hcHBseShlLm9uZShuKSx0KX0pLHRoaXN9fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJub2RlLWJhc2UiLCJwbHVnaW5ob3N0Il19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImRvbS1zY3JlZW4iLGZ1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKGUpe3ZhciB0PSJkb2N1bWVudEVsZW1lbnQiLG49ImNvbXBhdE1vZGUiLHI9InBvc2l0aW9uIixpPSJmaXhlZCIscz0icmVsYXRpdmUiLG89ImxlZnQiLHU9InRvcCIsYT0iQmFja0NvbXBhdCIsZj0ibWVkaXVtIixsPSJib3JkZXJMZWZ0V2lkdGgiLGM9ImJvcmRlclRvcFdpZHRoIixoPSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLHA9ImdldENvbXB1dGVkU3R5bGUiLGQ9ZS5ET00sdj0vXnQoPzphYmxlfGR8aCkkL2ksbTtlLlVBLmllJiYoZS5jb25maWcuZG9jW25dIT09IkJhY2tDb21wYXQiP209dDptPSJib2R5IiksZS5taXgoZCx7d2luSGVpZ2h0OmZ1bmN0aW9uKGUpe3ZhciB0PWQuX2dldFdpblNpemUoZSkuaGVpZ2h0O3JldHVybiB0fSx3aW5XaWR0aDpmdW5jdGlvbihlKXt2YXIgdD1kLl9nZXRXaW5TaXplKGUpLndpZHRoO3JldHVybiB0fSxkb2NIZWlnaHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZC5fZ2V0RG9jU2l6ZShlKS5oZWlnaHQ7cmV0dXJuIE1hdGgubWF4KHQsZC5fZ2V0V2luU2l6ZShlKS5oZWlnaHQpfSxkb2NXaWR0aDpmdW5jdGlvbihlKXt2YXIgdD1kLl9nZXREb2NTaXplKGUpLndpZHRoO3JldHVybiBNYXRoLm1heCh0LGQuX2dldFdpblNpemUoZSkud2lkdGgpfSxkb2NTY3JvbGxYOmZ1bmN0aW9uKG4scil7cj1yfHxuP2QuX2dldERvYyhuKTplLmNvbmZpZy5kb2M7dmFyIGk9ci5kZWZhdWx0VmlldyxzPWk/aS5wYWdlWE9mZnNldDowO3JldHVybiBNYXRoLm1heChyW3RdLnNjcm9sbExlZnQsci5ib2R5LnNjcm9sbExlZnQscyl9LGRvY1Njcm9sbFk6ZnVuY3Rpb24obixyKXtyPXJ8fG4/ZC5fZ2V0RG9jKG4pOmUuY29uZmlnLmRvYzt2YXIgaT1yLmRlZmF1bHRWaWV3LHM9aT9pLnBhZ2VZT2Zmc2V0OjA7cmV0dXJuIE1hdGgubWF4KHJbdF0uc2Nyb2xsVG9wLHIuYm9keS5zY3JvbGxUb3Ascyl9LGdldFhZOmZ1bmN0aW9uKCl7cmV0dXJuIGUuY29uZmlnLmRvY1t0XVtoXT9mdW5jdGlvbihyKXt2YXIgaT1udWxsLHMsbyx1LGYsbCxjLHAsdixnLHk7aWYociYmci50YWdOYW1lKXtwPXIub3duZXJEb2N1bWVudCx1PXBbbl0sdSE9PWE/eT1wW3RdOnk9cC5ib2R5LHkuY29udGFpbnM/Zz15LmNvbnRhaW5zKHIpOmc9ZS5ET00uY29udGFpbnMoeSxyKTtpZihnKXt2PXAuZGVmYXVsdFZpZXcsdiYmInBhZ2VYT2Zmc2V0ImluIHY/KHM9di5wYWdlWE9mZnNldCxvPXYucGFnZVlPZmZzZXQpOihzPW0/cFttXS5zY3JvbGxMZWZ0OmQuZG9jU2Nyb2xsWChyLHApLG89bT9wW21dLnNjcm9sbFRvcDpkLmRvY1Njcm9sbFkocixwKSksZS5VQS5pZSYmKCFwLmRvY3VtZW50TW9kZXx8cC5kb2N1bWVudE1vZGU8OHx8dT09PWEpJiYobD15LmNsaWVudExlZnQsYz15LmNsaWVudFRvcCksZj1yW2hdKCksaT1bZi5sZWZ0LGYudG9wXTtpZihsfHxjKWlbMF0tPWwsaVsxXS09YztpZihvfHxzKWlmKCFlLlVBLmlvc3x8ZS5VQS5pb3M+PTQuMilpWzBdKz1zLGlbMV0rPW99ZWxzZSBpPWQuX2dldE9mZnNldChyKX1yZXR1cm4gaX06ZnVuY3Rpb24odCl7dmFyIG49bnVsbCxzLG8sdSxhLGY7aWYodClpZihkLmluRG9jKHQpKXtuPVt0Lm9mZnNldExlZnQsdC5vZmZzZXRUb3BdLHM9dC5vd25lckRvY3VtZW50LG89dCx1PWUuVUEuZ2Vja298fGUuVUEud2Via2l0PjUxOT8hMDohMTt3aGlsZShvPW8ub2Zmc2V0UGFyZW50KW5bMF0rPW8ub2Zmc2V0TGVmdCxuWzFdKz1vLm9mZnNldFRvcCx1JiYobj1kLl9jYWxjQm9yZGVycyhvLG4pKTtpZihkLmdldFN0eWxlKHQscikhPWkpe289dDt3aGlsZShvPW8ucGFyZW50Tm9kZSl7YT1vLnNjcm9sbFRvcCxmPW8uc2Nyb2xsTGVmdCxlLlVBLmdlY2tvJiZkLmdldFN0eWxlKG8sIm92ZXJmbG93IikhPT0idmlzaWJsZSImJihuPWQuX2NhbGNCb3JkZXJzKG8sbikpO2lmKGF8fGYpblswXS09ZixuWzFdLT1hfW5bMF0rPWQuZG9jU2Nyb2xsWCh0LHMpLG5bMV0rPWQuZG9jU2Nyb2xsWSh0LHMpfWVsc2UgblswXSs9ZC5kb2NTY3JvbGxYKHQscyksblsxXSs9ZC5kb2NTY3JvbGxZKHQscyl9ZWxzZSBuPWQuX2dldE9mZnNldCh0KTtyZXR1cm4gbn19KCksZ2V0U2Nyb2xsYmFyV2lkdGg6ZS5jYWNoZWQoZnVuY3Rpb24oKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHI9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGk9LjE7cmV0dXJuIHImJihuLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO3Zpc2liaWxpdHk6aGlkZGVuO292ZXJmbG93OnNjcm9sbDt3aWR0aDoyMHB4OyIsbi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoInAiKSkuc3R5bGUuaGVpZ2h0PSIxcHgiLHIuaW5zZXJ0QmVmb3JlKG4sci5maXJzdENoaWxkKSxpPW4ub2Zmc2V0V2lkdGgtbi5jbGllbnRXaWR0aCxyLnJlbW92ZUNoaWxkKG4pKSxpfSxudWxsLC4xKSxnZXRYOmZ1bmN0aW9uKGUpe3JldHVybiBkLmdldFhZKGUpWzBdfSxnZXRZOmZ1bmN0aW9uKGUpe3JldHVybiBkLmdldFhZKGUpWzFdfSxzZXRYWTpmdW5jdGlvbihlLHQsbil7dmFyIGk9ZC5zZXRTdHlsZSxhLGYsbCxjO2UmJnQmJihhPWQuZ2V0U3R5bGUoZSxyKSxmPWQuX2dldE9mZnNldChlKSxhPT0ic3RhdGljIiYmKGE9cyxpKGUscixhKSksYz1kLmdldFhZKGUpLHRbMF0hPT1udWxsJiZpKGUsbyx0WzBdLWNbMF0rZlswXSsicHgiKSx0WzFdIT09bnVsbCYmaShlLHUsdFsxXS1jWzFdK2ZbMV0rInB4Iiksbnx8KGw9ZC5nZXRYWShlKSwobFswXSE9PXRbMF18fGxbMV0hPT10WzFdKSYmZC5zZXRYWShlLHQsITApKSl9LHNldFg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZC5zZXRYWShlLFt0LG51bGxdKX0sc2V0WTpmdW5jdGlvbihlLHQpe3JldHVybiBkLnNldFhZKGUsW251bGwsdF0pfSxzd2FwWFk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1kLmdldFhZKGUpO2Quc2V0WFkoZSxkLmdldFhZKHQpKSxkLnNldFhZKHQsbil9LF9jYWxjQm9yZGVyczpmdW5jdGlvbih0LG4pe3ZhciByPXBhcnNlSW50KGRbcF0odCxjKSwxMCl8fDAsaT1wYXJzZUludChkW3BdKHQsbCksMTApfHwwO3JldHVybiBlLlVBLmdlY2tvJiZ2LnRlc3QodC50YWdOYW1lKSYmKHI9MCxpPTApLG5bMF0rPWksblsxXSs9cixufSxfZ2V0V2luU2l6ZTpmdW5jdGlvbihyLGkpe2k9aXx8cj9kLl9nZXREb2Mocik6ZS5jb25maWcuZG9jO3ZhciBzPWkuZGVmYXVsdFZpZXd8fGkucGFyZW50V2luZG93LG89aVtuXSx1PXMuaW5uZXJIZWlnaHQsYT1zLmlubmVyV2lkdGgsZj1pW3RdO3JldHVybiBvJiYhZS5VQS5vcGVyYSYmKG8hPSJDU1MxQ29tcGF0IiYmKGY9aS5ib2R5KSx1PWYuY2xpZW50SGVpZ2h0LGE9Zi5jbGllbnRXaWR0aCkse2hlaWdodDp1LHdpZHRoOmF9fSxfZ2V0RG9jU2l6ZTpmdW5jdGlvbihyKXt2YXIgaT1yP2QuX2dldERvYyhyKTplLmNvbmZpZy5kb2Mscz1pW3RdO3JldHVybiBpW25dIT0iQ1NTMUNvbXBhdCImJihzPWkuYm9keSkse2hlaWdodDpzLnNjcm9sbEhlaWdodCx3aWR0aDpzLnNjcm9sbFdpZHRofX19KX0pKGUpLGZ1bmN0aW9uKGUpe3ZhciB0PSJ0b3AiLG49InJpZ2h0IixyPSJib3R0b20iLGk9ImxlZnQiLHM9ZnVuY3Rpb24oZSxzKXt2YXIgbz1NYXRoLm1heChlW3RdLHNbdF0pLHU9TWF0aC5taW4oZVtuXSxzW25dKSxhPU1hdGgubWluKGVbcl0sc1tyXSksZj1NYXRoLm1heChlW2ldLHNbaV0pLGw9e307cmV0dXJuIGxbdF09byxsW25dPXUsbFtyXT1hLGxbaV09ZixsfSxvPWUuRE9NO2UubWl4KG8se3JlZ2lvbjpmdW5jdGlvbihlKXt2YXIgdD1vLmdldFhZKGUpLG49ITE7cmV0dXJuIGUmJnQmJihuPW8uX2dldFJlZ2lvbih0WzFdLHRbMF0rZS5vZmZzZXRXaWR0aCx0WzFdK2Uub2Zmc2V0SGVpZ2h0LHRbMF0pKSxufSxpbnRlcnNlY3Q6ZnVuY3Rpb24odSxhLGYpe3ZhciBsPWZ8fG8ucmVnaW9uKHUpLGM9e30saD1hLHA7aWYoaC50YWdOYW1lKWM9by5yZWdpb24oaCk7ZWxzZXtpZighZS5MYW5nLmlzT2JqZWN0KGEpKXJldHVybiExO2M9YX1yZXR1cm4gcD1zKGMsbCkse3RvcDpwW3RdLHJpZ2h0OnBbbl0sYm90dG9tOnBbcl0sbGVmdDpwW2ldLGFyZWE6KHBbcl0tcFt0XSkqKHBbbl0tcFtpXSkseW9mZjpwW3JdLXBbdF0seG9mZjpwW25dLXBbaV0saW5SZWdpb246by5pblJlZ2lvbih1LGEsITEsZil9fSxpblJlZ2lvbjpmdW5jdGlvbih1LGEsZixsKXt2YXIgYz17fSxoPWx8fG8ucmVnaW9uKHUpLHA9YSxkO2lmKHAudGFnTmFtZSljPW8ucmVnaW9uKHApO2Vsc2V7aWYoIWUuTGFuZy5pc09iamVjdChhKSlyZXR1cm4hMTtjPWF9cmV0dXJuIGY/aFtpXT49Y1tpXSYmaFtuXTw9Y1tuXSYmaFt0XT49Y1t0XSYmaFtyXTw9Y1tyXTooZD1zKGMsaCksZFtyXT49ZFt0XSYmZFtuXT49ZFtpXT8hMDohMSl9LGluVmlld3BvcnRSZWdpb246ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBvLmluUmVnaW9uKGUsby52aWV3cG9ydFJlZ2lvbihlKSx0LG4pfSxfZ2V0UmVnaW9uOmZ1bmN0aW9uKGUscyxvLHUpe3ZhciBhPXt9O3JldHVybiBhW3RdPWFbMV09ZSxhW2ldPWFbMF09dSxhW3JdPW8sYVtuXT1zLGEud2lkdGg9YVtuXS1hW2ldLGEuaGVpZ2h0PWFbcl0tYVt0XSxhfSx2aWV3cG9ydFJlZ2lvbjpmdW5jdGlvbih0KXt0PXR8fGUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnQ7dmFyIG49ITEscixpO3JldHVybiB0JiYocj1vLmRvY1Njcm9sbFgodCksaT1vLmRvY1Njcm9sbFkodCksbj1vLl9nZXRSZWdpb24oaSxvLndpbldpZHRoKHQpK3IsaStvLndpbkhlaWdodCh0KSxyKSksbn19KX0oZSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1iYXNlIiwiZG9tLXN0eWxlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtc2NyZWVuIixmdW5jdGlvbihlLHQpe2UuZWFjaChbIndpbldpZHRoIiwid2luSGVpZ2h0IiwiZG9jV2lkdGgiLCJkb2NIZWlnaHQiLCJkb2NTY3JvbGxYIiwiZG9jU2Nyb2xsWSJdLGZ1bmN0aW9uKHQpe2UuTm9kZS5BVFRSU1t0XT17Z2V0dGVyOmZ1bmN0aW9uKCl7dmFyIG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gbi51bnNoaWZ0KGUuTm9kZS5nZXRET01Ob2RlKHRoaXMpKSxlLkRPTVt0XS5hcHBseSh0aGlzLG4pfX19KSxlLk5vZGUuQVRUUlMuc2Nyb2xsTGVmdD17Z2V0dGVyOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5Ob2RlLmdldERPTU5vZGUodGhpcyk7cmV0dXJuInNjcm9sbExlZnQiaW4gdD90LnNjcm9sbExlZnQ6ZS5ET00uZG9jU2Nyb2xsWCh0KX0sc2V0dGVyOmZ1bmN0aW9uKHQpe3ZhciBuPWUuTm9kZS5nZXRET01Ob2RlKHRoaXMpO24mJigic2Nyb2xsTGVmdCJpbiBuP24uc2Nyb2xsTGVmdD10OihuLmRvY3VtZW50fHxuLm5vZGVUeXBlPT09OSkmJmUuRE9NLl9nZXRXaW4obikuc2Nyb2xsVG8odCxlLkRPTS5kb2NTY3JvbGxZKG4pKSl9fSxlLk5vZGUuQVRUUlMuc2Nyb2xsVG9wPXtnZXR0ZXI6ZnVuY3Rpb24oKXt2YXIgdD1lLk5vZGUuZ2V0RE9NTm9kZSh0aGlzKTtyZXR1cm4ic2Nyb2xsVG9wImluIHQ/dC5zY3JvbGxUb3A6ZS5ET00uZG9jU2Nyb2xsWSh0KX0sc2V0dGVyOmZ1bmN0aW9uKHQpe3ZhciBuPWUuTm9kZS5nZXRET01Ob2RlKHRoaXMpO24mJigic2Nyb2xsVG9wImluIG4/bi5zY3JvbGxUb3A9dDoobi5kb2N1bWVudHx8bi5ub2RlVHlwZT09PTkpJiZlLkRPTS5fZ2V0V2luKG4pLnNjcm9sbFRvKGUuRE9NLmRvY1Njcm9sbFgobiksdCkpfX0sZS5Ob2RlLmltcG9ydE1ldGhvZChlLkRPTSxbImdldFhZIiwic2V0WFkiLCJnZXRYIiwic2V0WCIsImdldFkiLCJzZXRZIiwic3dhcFhZIl0pLGUuTm9kZS5BVFRSUy5yZWdpb249e2dldHRlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0RE9NTm9kZSgpLG47cmV0dXJuIHQmJiF0LnRhZ05hbWUmJnQubm9kZVR5cGU9PT05JiYodD10LmRvY3VtZW50RWxlbWVudCksZS5ET00uaXNXaW5kb3codCk/bj1lLkRPTS52aWV3cG9ydFJlZ2lvbih0KTpuPWUuRE9NLnJlZ2lvbih0KSxufX0sZS5Ob2RlLkFUVFJTLnZpZXdwb3J0UmVnaW9uPXtnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gZS5ET00udmlld3BvcnRSZWdpb24oZS5Ob2RlLmdldERPTU5vZGUodGhpcykpfX0sZS5Ob2RlLmltcG9ydE1ldGhvZChlLkRPTSwiaW5WaWV3cG9ydFJlZ2lvbiIpLGUuTm9kZS5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5Ob2RlLmdldERPTU5vZGUodGhpcyk7cmV0dXJuIGUuaW5zdGFuY2VPZih0LGUuTm9kZSkmJih0PWUuTm9kZS5nZXRET01Ob2RlKHQpKSxlLkRPTS5pbnRlcnNlY3Qocix0LG4pfSxlLk5vZGUucHJvdG90eXBlLmluUmVnaW9uPWZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLk5vZGUuZ2V0RE9NTm9kZSh0aGlzKTtyZXR1cm4gZS5pbnN0YW5jZU9mKHQsZS5Ob2RlKSYmKHQ9ZS5Ob2RlLmdldERPTU5vZGUodCkpLGUuRE9NLmluUmVnaW9uKGksdCxuLHIpfX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZG9tLXNjcmVlbiIsIm5vZGUtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJub2RlLXN0eWxlIixmdW5jdGlvbihlLHQpeyhmdW5jdGlvbihlKXtlLm1peChlLk5vZGUucHJvdG90eXBlLHtzZXRTdHlsZTpmdW5jdGlvbih0LG4pe3JldHVybiBlLkRPTS5zZXRTdHlsZSh0aGlzLl9ub2RlLHQsbiksdGhpc30sc2V0U3R5bGVzOmZ1bmN0aW9uKHQpe3JldHVybiBlLkRPTS5zZXRTdHlsZXModGhpcy5fbm9kZSx0KSx0aGlzfSxnZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gZS5ET00uZ2V0U3R5bGUodGhpcy5fbm9kZSx0KX0sZ2V0Q29tcHV0ZWRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gZS5ET00uZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9ub2RlLHQpfX0pLGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJnZXRTdHlsZSIsImdldENvbXB1dGVkU3R5bGUiLCJzZXRTdHlsZSIsInNldFN0eWxlcyJdKX0pKGUpO3ZhciBuPWUuTm9kZTtlLm1peChuLnByb3RvdHlwZSx7c2hvdzpmdW5jdGlvbihlKXtyZXR1cm4gZT1hcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXSx0aGlzLnRvZ2dsZVZpZXcoITAsZSksdGhpc30sX3Nob3c6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIiksdGhpcy5zZXRTdHlsZSgiZGlzcGxheSIsIiIpfSxfaXNIaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoImhpZGRlbiIpfHxlLkRPTS5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX25vZGUsImRpc3BsYXkiKT09PSJub25lIn0sdG9nZ2xlVmlldzpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl90b2dnbGVWaWV3LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzfSxfdG9nZ2xlVmlldzpmdW5jdGlvbihlLHQpe3JldHVybiB0PWFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdLHR5cGVvZiBlIT0iYm9vbGVhbiImJihlPXRoaXMuX2lzSGlkZGVuKCk/MTowKSxlP3RoaXMuX3Nob3coKTp0aGlzLl9oaWRlKCksdHlwZW9mIHQ9PSJmdW5jdGlvbiImJnQuY2FsbCh0aGlzKSx0aGlzfSxoaWRlOmZ1bmN0aW9uKGUpe3JldHVybiBlPWFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdLHRoaXMudG9nZ2xlVmlldyghMSxlKSx0aGlzfSxfaGlkZTpmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCJoaWRkZW4iKSx0aGlzLnNldFN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpfX0pLGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJzaG93IiwiaGlkZSIsInRvZ2dsZVZpZXciXSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1zdHlsZSIsIm5vZGUtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJxdWVyeXN0cmluZy1zdHJpbmdpZnktc2ltcGxlIixmdW5jdGlvbihlLHQpe3ZhciBuPWUubmFtZXNwYWNlKCJRdWVyeVN0cmluZyIpLHI9ZW5jb2RlVVJJQ29tcG9uZW50O24uc3RyaW5naWZ5PWZ1bmN0aW9uKHQsbil7dmFyIGk9W10scz1uJiZuLmFycmF5S2V5PyEwOiExLG8sdSxhO2ZvcihvIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShvKSlpZihlLkxhbmcuaXNBcnJheSh0W29dKSlmb3IodT0wLGE9dFtvXS5sZW5ndGg7dTxhO3UrKylpLnB1c2gocihzP28rIltdIjpvKSsiPSIrcih0W29dW3VdKSk7ZWxzZSBpLnB1c2gocihvKSsiPSIrcih0W29dKSk7cmV0dXJuIGkuam9pbigiJiIpfX0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiaW8tYmFzZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBvKHQpe3ZhciBuPXRoaXM7bi5fdWlkPSJpbzoiK3MrKyxuLl9pbml0KHQpLGUuaW8uX21hcFtuLl91aWRdPW59dmFyIG49WyJzdGFydCIsImNvbXBsZXRlIiwiZW5kIiwic3VjY2VzcyIsImZhaWx1cmUiLCJwcm9ncmVzcyJdLHI9WyJzdGF0dXMiLCJzdGF0dXNUZXh0IiwicmVzcG9uc2VUZXh0IiwicmVzcG9uc2VYTUwiXSxpPWUuY29uZmlnLndpbixzPTA7by5wcm90b3R5cGU9e19pZDowLF9oZWFkZXJzOnsiWC1SZXF1ZXN0ZWQtV2l0aCI6IlhNTEh0dHBSZXF1ZXN0In0sX3RpbWVvdXQ6e30sX2luaXQ6ZnVuY3Rpb24odCl7dmFyIHI9dGhpcyxpLHM7ci5jZmc9dHx8e30sZS5hdWdtZW50KHIsZS5FdmVudFRhcmdldCk7Zm9yKGk9MCxzPW4ubGVuZ3RoO2k8czsrK2kpci5wdWJsaXNoKCJpbzoiK25baV0sZS5tZXJnZSh7YnJvYWRjYXN0OjF9LHQpKSxyLnB1Ymxpc2goImlvLXRybjoiK25baV0sdCl9LF9jcmVhdGU6ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzLHM9e2lkOmUuTGFuZy5pc051bWJlcihuKT9uOnIuX2lkKyssdWlkOnIuX3VpZH0sbz10Lnhkcj90Lnhkci51c2U6bnVsbCx1PXQuZm9ybSYmdC5mb3JtLnVwbG9hZD8iaWZyYW1lIjpudWxsLGE7cmV0dXJuIG89PT0ibmF0aXZlIiYmKG89ZS5VQS5pZSYmIWw/InhkciI6bnVsbCxyLnNldEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIpKSxhPW98fHUscz1hP2UubWVyZ2UoZS5JTy5jdXN0b21UcmFuc3BvcnQoYSkscyk6ZS5tZXJnZShlLklPLmRlZmF1bHRUcmFuc3BvcnQoKSxzKSxzLm5vdGlmeSYmKHQubm90aWZ5PWZ1bmN0aW9uKGUsdCxuKXtyLm5vdGlmeShlLHQsbil9KSxhfHxpJiZpLkZvcm1EYXRhJiZ0LmRhdGEgaW5zdGFuY2VvZiBpLkZvcm1EYXRhJiYocy5jLnVwbG9hZC5vbnByb2dyZXNzPWZ1bmN0aW9uKGUpe3IucHJvZ3Jlc3MocyxlLHQpfSxzLmMub25sb2FkPWZ1bmN0aW9uKGUpe3IubG9hZChzLGUsdCl9LHMuYy5vbmVycm9yPWZ1bmN0aW9uKGUpe3IuZXJyb3IocyxlLHQpfSxzLnVwbG9hZD0hMCksc30sX2Rlc3Ryb3k6ZnVuY3Rpb24odCl7aSYmIXQubm90aWZ5JiYhdC54ZHImJih1JiYhdC51cGxvYWQ/dC5jLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsOnQudXBsb2FkPyh0LmMudXBsb2FkLm9ucHJvZ3Jlc3M9bnVsbCx0LmMub25sb2FkPW51bGwsdC5jLm9uZXJyb3I9bnVsbCk6ZS5VQS5pZSYmIXQuZSYmdC5jLmFib3J0KCkpLHQ9dC5jPW51bGx9LF9ldnQ6ZnVuY3Rpb24odCxyLGkpe3ZhciBzPXRoaXMsbyx1PWkuYXJndW1lbnRzLGE9cy5jZmcuZW1pdEZhY2FkZSxmPSJpbzoiK3QsbD0iaW8tdHJuOiIrdDt0aGlzLmRldGFjaChsKSxyLmUmJihyLmM9e3N0YXR1czowLHN0YXR1c1RleHQ6ci5lfSksbz1bYT97aWQ6ci5pZCxkYXRhOnIuYyxjZmc6aSxhcmd1bWVudHM6dX06ci5pZF0sYXx8KHQ9PT1uWzBdfHx0PT09blsyXT91JiZvLnB1c2godSk6KHIuZXZ0P28ucHVzaChyLmV2dCk6by5wdXNoKHIuYyksdSYmby5wdXNoKHUpKSksby51bnNoaWZ0KGYpLHMuZmlyZS5hcHBseShzLG8pLGkub24mJihvWzBdPWwscy5vbmNlKGwsaS5vblt0XSxpLmNvbnRleHR8fGUpLHMuZmlyZS5hcHBseShzLG8pKX0sc3RhcnQ6ZnVuY3Rpb24oZSx0KXt0aGlzLl9ldnQoblswXSxlLHQpfSxjb21wbGV0ZTpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzFdLGUsdCl9LGVuZDpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzJdLGUsdCksdGhpcy5fZGVzdHJveShlKX0sc3VjY2VzczpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzNdLGUsdCksdGhpcy5lbmQoZSx0KX0sZmFpbHVyZTpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzRdLGUsdCksdGhpcy5lbmQoZSx0KX0scHJvZ3Jlc3M6ZnVuY3Rpb24oZSx0LHIpe2UuZXZ0PXQsdGhpcy5fZXZ0KG5bNV0sZSxyKX0sbG9hZDpmdW5jdGlvbihlLHQscil7ZS5ldnQ9dC50YXJnZXQsdGhpcy5fZXZ0KG5bMV0sZSxyKX0sZXJyb3I6ZnVuY3Rpb24oZSx0LHIpe2UuZXZ0PXQsdGhpcy5fZXZ0KG5bNF0sZSxyKX0sX3JldHJ5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fZGVzdHJveShlKSxuLnhkci51c2U9ImZsYXNoIix0aGlzLnNlbmQodCxuLGUuaWQpfSxfY29uY2F0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUrPShlLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK3QsZX0sc2V0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7dD90aGlzLl9oZWFkZXJzW2VdPXQ6ZGVsZXRlIHRoaXMuX2hlYWRlcnNbZV19LF9zZXRIZWFkZXJzOmZ1bmN0aW9uKHQsbil7bj1lLm1lcmdlKHRoaXMuX2hlYWRlcnMsbiksZS5PYmplY3QuZWFjaChuLGZ1bmN0aW9uKGUscil7ZSE9PSJkaXNhYmxlIiYmdC5zZXRSZXF1ZXN0SGVhZGVyKHIsbltyXSl9KX0sX3N0YXJ0VGltZW91dDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7bi5fdGltZW91dFtlLmlkXT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5fYWJvcnQoZSwidGltZW91dCIpfSx0KX0sX2NsZWFyVGltZW91dDpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dFtlXSksZGVsZXRlIHRoaXMuX3RpbWVvdXRbZV19LF9yZXN1bHQ6ZnVuY3Rpb24oZSx0KXt2YXIgbjt0cnl7bj1lLmMuc3RhdHVzfWNhdGNoKHIpe249MH1uPj0yMDAmJm48MzAwfHxuPT09MzA0fHxuPT09MTIyMz90aGlzLnN1Y2Nlc3MoZSx0KTp0aGlzLmZhaWx1cmUoZSx0KX0sX3JTOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztlLmMucmVhZHlTdGF0ZT09PTQmJih0LnRpbWVvdXQmJm4uX2NsZWFyVGltZW91dChlLmlkKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5jb21wbGV0ZShlLHQpLG4uX3Jlc3VsdChlLHQpfSwwKSl9LF9hYm9ydDpmdW5jdGlvbihlLHQpe2UmJmUuYyYmKGUuZT10LGUuYy5hYm9ydCgpKX0sc2VuZDpmdW5jdGlvbih0LG4saSl7dmFyIHMsbyx1LGEsZixjLGg9dGhpcyxwPXQsZD17fTtuPW4/ZS5PYmplY3Qobik6e30scz1oLl9jcmVhdGUobixpKSxvPW4ubWV0aG9kP24ubWV0aG9kLnRvVXBwZXJDYXNlKCk6IkdFVCIsZj1uLnN5bmMsYz1uLmRhdGEsZS5MYW5nLmlzT2JqZWN0KGMpJiYhYy5ub2RlVHlwZSYmIXMudXBsb2FkJiZlLlF1ZXJ5U3RyaW5nJiZlLlF1ZXJ5U3RyaW5nLnN0cmluZ2lmeSYmKG4uZGF0YT1jPWUuUXVlcnlTdHJpbmcuc3RyaW5naWZ5KGMpKTtpZihuLmZvcm0pe2lmKG4uZm9ybS51cGxvYWQpcmV0dXJuIGgudXBsb2FkKHMsdCxuKTtjPWguX3NlcmlhbGl6ZShuLmZvcm0sYyl9Y3x8KGM9IiIpO2lmKGMpc3dpdGNoKG8pe2Nhc2UiR0VUIjpjYXNlIkhFQUQiOmNhc2UiREVMRVRFIjpwPWguX2NvbmNhdChwLGMpLGM9IiI7YnJlYWs7Y2FzZSJQT1NUIjpjYXNlIlBVVCI6bi5oZWFkZXJzPWUubWVyZ2UoeyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgifSxuLmhlYWRlcnMpfWlmKHMueGRyKXJldHVybiBoLnhkcihwLHMsbik7aWYocy5ub3RpZnkpcmV0dXJuIHMuYy5zZW5kKHMsdCxuKTshZiYmIXMudXBsb2FkJiYocy5jLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2guX3JTKHMsbil9KTt0cnl7cy5jLm9wZW4obyxwLCFmLG4udXNlcm5hbWV8fG51bGwsbi5wYXNzd29yZHx8bnVsbCksaC5fc2V0SGVhZGVycyhzLmMsbi5oZWFkZXJzfHx7fSksaC5zdGFydChzLG4pLG4ueGRyJiZuLnhkci5jcmVkZW50aWFscyYmbCYmKHMuYy53aXRoQ3JlZGVudGlhbHM9ITApLHMuYy5zZW5kKGMpO2lmKGYpe2Zvcih1PTAsYT1yLmxlbmd0aDt1PGE7Kyt1KWRbclt1XV09cy5jW3JbdV1dO3JldHVybiBkLmdldEFsbFJlc3BvbnNlSGVhZGVycz1mdW5jdGlvbigpe3JldHVybiBzLmMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCl9LGQuZ2V0UmVzcG9uc2VIZWFkZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuYy5nZXRSZXNwb25zZUhlYWRlcihlKX0saC5jb21wbGV0ZShzLG4pLGguX3Jlc3VsdChzLG4pLGR9fWNhdGNoKHYpe2lmKHMueGRyKXJldHVybiBoLl9yZXRyeShzLHQsbik7aC5jb21wbGV0ZShzLG4pLGguX3Jlc3VsdChzLG4pfXJldHVybiBuLnRpbWVvdXQmJmguX3N0YXJ0VGltZW91dChzLG4udGltZW91dCkse2lkOnMuaWQsYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5jP2guX2Fib3J0KHMsImFib3J0Iik6ITF9LGlzSW5Qcm9ncmVzczpmdW5jdGlvbigpe3JldHVybiBzLmM/cy5jLnJlYWR5U3RhdGUlNDohMX0saW86aH19fSxlLmlvPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5pby5fbWFwWyJpbzowIl18fG5ldyBvO3JldHVybiByLnNlbmQuYXBwbHkocixbdCxuXSl9LGUuaW8uaGVhZGVyPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5pby5fbWFwWyJpbzowIl18fG5ldyBvO3Iuc2V0SGVhZGVyKHQsbil9LGUuSU89byxlLmlvLl9tYXA9e307dmFyIHU9aSYmaS5YTUxIdHRwUmVxdWVzdCxhPWkmJmkuWERvbWFpblJlcXVlc3QsZj1pJiZpLkFjdGl2ZVhPYmplY3QsbD11JiYid2l0aENyZWRlbnRpYWxzImluIG5ldyBYTUxIdHRwUmVxdWVzdDtlLm1peChlLklPLHtfZGVmYXVsdDoieGhyIixkZWZhdWx0VHJhbnNwb3J0OmZ1bmN0aW9uKHQpe2lmKCF0KXt2YXIgbj17YzplLklPLnRyYW5zcG9ydHNbZS5JTy5fZGVmYXVsdF0oKSxub3RpZnk6ZS5JTy5fZGVmYXVsdD09PSJ4aHIiPyExOiEwfTtyZXR1cm4gbn1lLklPLl9kZWZhdWx0PXR9LHRyYW5zcG9ydHM6e3hocjpmdW5jdGlvbigpe3JldHVybiB1P25ldyBYTUxIdHRwUmVxdWVzdDpmP25ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOm51bGx9LHhkcjpmdW5jdGlvbigpe3JldHVybiBhP25ldyBYRG9tYWluUmVxdWVzdDpudWxsfSxpZnJhbWU6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZmxhc2g6bnVsbCxub2RlanM6bnVsbH0sY3VzdG9tVHJhbnNwb3J0OmZ1bmN0aW9uKHQpe3ZhciBuPXtjOmUuSU8udHJhbnNwb3J0c1t0XSgpfTtyZXR1cm4gblt0PT09InhkciJ8fHQ9PT0iZmxhc2giPyJ4ZHIiOiJub3RpZnkiXT0hMCxufX0pLGUubWl4KGUuSU8ucHJvdG90eXBlLHtub3RpZnk6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7c3dpdGNoKGUpe2Nhc2UidGltZW91dCI6Y2FzZSJhYm9ydCI6Y2FzZSJ0cmFuc3BvcnQgZXJyb3IiOnQuYz17c3RhdHVzOjAsc3RhdHVzVGV4dDplfSxlPSJmYWlsdXJlIjtkZWZhdWx0OnJbZV0uYXBwbHkocixbdCxuXSl9fX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSIsInF1ZXJ5c3RyaW5nLXN0cmluZ2lmeS1zaW1wbGUiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgianNvbi1wYXJzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbmZpZy5nbG9iYWwuSlNPTjtlLm5hbWVzcGFjZSgiSlNPTiIpLnBhcnNlPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gbi5wYXJzZSh0eXBlb2YgZT09InN0cmluZyI/ZTplKyIiLHQscil9fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ0cmFuc2l0aW9uIixmdW5jdGlvbihlLHQpe3ZhciBuPSIiLHI9IiIsaT1lLmNvbmZpZy5kb2Mscz0iZG9jdW1lbnRFbGVtZW50IixvPWlbc10uc3R5bGUsdT0idHJhbnNpdGlvbiIsYT0idHJhbnNpdGlvblByb3BlcnR5IixmLGwsYyxoLHAsZCx2PXt9LG09WyJXZWJraXQiLCJNb3oiXSxnPXtXZWJraXQ6IndlYmtpdFRyYW5zaXRpb25FbmQifSx5PWZ1bmN0aW9uKCl7dGhpcy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX07eS5fVFJBTlNGT1JNPSJ0cmFuc2Zvcm0iLHkuX3RvQ2FtZWw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKC8tKFthLXpdKS9naSxmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9KSxlfSx5Ll90b0h5cGhlbj1mdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoLyhbQS1aXT8pKFthLXpdKykoW0EtWl0/KS9nLGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPSh0PyItIit0LnRvTG93ZXJDYXNlKCk6IiIpK247cmV0dXJuIHImJihpKz0iLSIrci50b0xvd2VyQ2FzZSgpKSxpfSksZX0seS5TSE9XX1RSQU5TSVRJT049ImZhZGVJbiIseS5ISURFX1RSQU5TSVRJT049ImZhZGVPdXQiLHkudXNlTmF0aXZlPSExLCJ0cmFuc2l0aW9uImluIG8mJiJ0cmFuc2l0aW9uUHJvcGVydHkiaW4gbyYmInRyYW5zaXRpb25EdXJhdGlvbiJpbiBvJiYidHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uImluIG8mJiJ0cmFuc2l0aW9uRGVsYXkiaW4gbz8oeS51c2VOYXRpdmU9ITAseS5zdXBwb3J0ZWQ9ITApOmUuQXJyYXkuZWFjaChtLGZ1bmN0aW9uKGUpe3ZhciB0PWUrIlRyYW5zaXRpb24iO3QgaW4gaVtzXS5zdHlsZSYmKG49ZSxyPXkuX3RvSHlwaGVuKGUpKyItIix5LnVzZU5hdGl2ZT0hMCx5LnN1cHBvcnRlZD0hMCx5Ll9WRU5ET1JfUFJFRklYPWUpfSksdHlwZW9mIG8udHJhbnNmb3JtPT0idW5kZWZpbmVkIiYmZS5BcnJheS5lYWNoKG0sZnVuY3Rpb24oZSl7dmFyIHQ9ZSsiVHJhbnNmb3JtIjt0eXBlb2Ygb1t0XSE9InVuZGVmaW5lZCImJih5Ll9UUkFOU0ZPUk09dCl9KSxuJiYodT1uKyJUcmFuc2l0aW9uIixhPW4rIlRyYW5zaXRpb25Qcm9wZXJ0eSIpLGY9cisidHJhbnNpdGlvbi1wcm9wZXJ0eSIsbD1yKyJ0cmFuc2l0aW9uLWR1cmF0aW9uIixjPXIrInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIixoPXIrInRyYW5zaXRpb24tZGVsYXkiLHA9InRyYW5zaXRpb25lbmQiLGQ9Im9uIituLnRvTG93ZXJDYXNlKCkrInRyYW5zaXRpb25lbmQiLHA9Z1tuXXx8cCx5LmZ4PXt9LHkudG9nZ2xlcz17fSx5Ll9oYXNFbmQ9e30seS5fcmVLZXl3b3Jkcz0vXig/Om5vZGV8ZHVyYXRpb258aXRlcmF0aW9uc3xlYXNpbmd8ZGVsYXl8b258b25zdGFydHxvbmVuZCkkL2ksZS5Ob2RlLkRPTV9FVkVOVFNbcF09MSx5Lk5BTUU9InRyYW5zaXRpb24iLHkuREVGQVVMVF9FQVNJTkc9ImVhc2UiLHkuREVGQVVMVF9EVVJBVElPTj0uNSx5LkRFRkFVTFRfREVMQVk9MCx5Ll9ub2RlQXR0cnM9e30seS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnksaW5pdDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIG4uX25vZGU9ZSwhbi5fcnVubmluZyYmdCYmKG4uX2NvbmZpZz10LGUuX3RyYW5zaXRpb249bixuLl9kdXJhdGlvbj0iZHVyYXRpb24iaW4gdD90LmR1cmF0aW9uOm4uY29uc3RydWN0b3IuREVGQVVMVF9EVVJBVElPTixuLl9kZWxheT0iZGVsYXkiaW4gdD90LmRlbGF5Om4uY29uc3RydWN0b3IuREVGQVVMVF9ERUxBWSxuLl9lYXNpbmc9dC5lYXNpbmd8fG4uY29uc3RydWN0b3IuREVGQVVMVF9FQVNJTkcsbi5fY291bnQ9MCxuLl9ydW5uaW5nPSExKSxufSxhZGRQcm9wZXJ0eTpmdW5jdGlvbih0LG4pe3ZhciByPXRoaXMsaT10aGlzLl9ub2RlLHM9ZS5zdGFtcChpKSxvPWUub25lKGkpLHU9eS5fbm9kZUF0dHJzW3NdLGEsZixsLGMsaDt1fHwodT15Ll9ub2RlQXR0cnNbc109e30pLGM9dVt0XSxuJiZuLnZhbHVlIT09dW5kZWZpbmVkP2g9bi52YWx1ZTpuIT09dW5kZWZpbmVkJiYoaD1uLG49diksdHlwZW9mIGg9PSJmdW5jdGlvbiImJihoPWguY2FsbChvLG8pKSxjJiZjLnRyYW5zaXRpb24mJmMudHJhbnNpdGlvbiE9PXImJmMudHJhbnNpdGlvbi5fY291bnQtLSxyLl9jb3VudCsrLGw9KHR5cGVvZiBuLmR1cmF0aW9uIT0idW5kZWZpbmVkIj9uLmR1cmF0aW9uOnIuX2R1cmF0aW9uKXx8MWUtNCx1W3RdPXt2YWx1ZTpoLGR1cmF0aW9uOmwsZGVsYXk6dHlwZW9mIG4uZGVsYXkhPSJ1bmRlZmluZWQiP24uZGVsYXk6ci5fZGVsYXksZWFzaW5nOm4uZWFzaW5nfHxyLl9lYXNpbmcsdHJhbnNpdGlvbjpyfSxhPWUuRE9NLmdldENvbXB1dGVkU3R5bGUoaSx0KSxmPXR5cGVvZiBoPT0ic3RyaW5nIj9hOnBhcnNlRmxvYXQoYSkseS51c2VOYXRpdmUmJmY9PT1oJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5fb25OYXRpdmVFbmQuY2FsbChpLHtwcm9wZXJ0eU5hbWU6dCxlbGFwc2VkVGltZTpsfSl9LGwqMWUzKX0scmVtb3ZlUHJvcGVydHk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPXkuX25vZGVBdHRyc1tlLnN0YW1wKG4uX25vZGUpXTtyJiZyW3RdJiYoZGVsZXRlIHJbdF0sbi5fY291bnQtLSl9LGluaXRBdHRyczpmdW5jdGlvbih0KXt2YXIgbixyPXRoaXMuX25vZGU7dC50cmFuc2Zvcm0mJiF0W3kuX1RSQU5TRk9STV0mJih0W3kuX1RSQU5TRk9STV09dC50cmFuc2Zvcm0sZGVsZXRlIHQudHJhbnNmb3JtKTtmb3IobiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJiF5Ll9yZUtleXdvcmRzLnRlc3QobikmJih0aGlzLmFkZFByb3BlcnR5KG4sdFtuXSksci5zdHlsZVtuXT09PSIiJiZlLkRPTS5zZXRTdHlsZShyLG4sZS5ET00uZ2V0Q29tcHV0ZWRTdHlsZShyLG4pKSl9LHJ1bjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9bi5fbm9kZSxpPW4uX2NvbmZpZyxzPXt0eXBlOiJ0cmFuc2l0aW9uOnN0YXJ0Iixjb25maWc6aX07cmV0dXJuIG4uX3J1bm5pbmd8fChuLl9ydW5uaW5nPSEwLGkub24mJmkub24uc3RhcnQmJmkub24uc3RhcnQuY2FsbChlLm9uZShyKSxzKSxuLmluaXRBdHRycyhuLl9jb25maWcpLG4uX2NhbGxiYWNrPXQsbi5fc3RhcnQoKSksbn0sX3N0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcnVuTmF0aXZlKCl9LF9wcmVwRHVyOmZ1bmN0aW9uKGUpe3JldHVybiBlPXBhcnNlRmxvYXQoZSkqMWUzLGUrIm1zIn0sX3J1bk5hdGl2ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj10Ll9ub2RlLHI9ZS5zdGFtcChuKSxpPW4uc3R5bGUscz1uLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShuKSxvPXkuX25vZGVBdHRyc1tyXSx1PSIiLGE9c1t5Ll90b0NhbWVsKGYpXSxkPWYrIjogIix2PWwrIjogIixtPWMrIjogIixnPWgrIjogIixiLHcsRTthIT09ImFsbCImJihkKz1hKyIsIix2Kz1zW3kuX3RvQ2FtZWwobCldKyIsIixtKz1zW3kuX3RvQ2FtZWwoYyldKyIsIixnKz1zW3kuX3RvQ2FtZWwoaCldKyIsIik7Zm9yKEUgaW4gbyliPXkuX3RvSHlwaGVuKEUpLHc9b1tFXSwodz1vW0VdKSYmdy50cmFuc2l0aW9uPT09dCYmKEUgaW4gbi5zdHlsZT8odis9dC5fcHJlcER1cih3LmR1cmF0aW9uKSsiLCIsZys9dC5fcHJlcER1cih3LmRlbGF5KSsiLCIsbSs9dy5lYXNpbmcrIiwiLGQrPWIrIiwiLHUrPWIrIjogIit3LnZhbHVlKyI7ICIpOnRoaXMucmVtb3ZlUHJvcGVydHkoRSkpO2Q9ZC5yZXBsYWNlKC8sJC8sIjsiKSx2PXYucmVwbGFjZSgvLCQvLCI7IiksbT1tLnJlcGxhY2UoLywkLywiOyIpLGc9Zy5yZXBsYWNlKC8sJC8sIjsiKSx5Ll9oYXNFbmRbcl18fChuLmFkZEV2ZW50TGlzdGVuZXIocCx0Ll9vbk5hdGl2ZUVuZCwiIikseS5faGFzRW5kW3JdPSEwKSxpLmNzc1RleHQrPWQrdittK2crdX0sX2VuZDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9bi5fbm9kZSxpPW4uX2NhbGxiYWNrLHM9bi5fY29uZmlnLG89e3R5cGU6InRyYW5zaXRpb246ZW5kIixjb25maWc6cyxlbGFwc2VkVGltZTp0fSx1PWUub25lKHIpO24uX3J1bm5pbmc9ITEsbi5fY2FsbGJhY2s9bnVsbCxyJiYocy5vbiYmcy5vbi5lbmQ/c2V0VGltZW91dChmdW5jdGlvbigpe3Mub24uZW5kLmNhbGwodSxvKSxpJiZpLmNhbGwodSxvKX0sMSk6aSYmc2V0VGltZW91dChmdW5jdGlvbigpe2kuY2FsbCh1LG8pfSwxKSl9LF9lbmROYXRpdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZSxuPXQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsIiIpW3kuX3RvQ2FtZWwoZildO2U9eS5fdG9IeXBoZW4oZSksdHlwZW9mIG49PSJzdHJpbmciJiYobj1uLnJlcGxhY2UobmV3IFJlZ0V4cCgiKD86XnwsXFxzKSIrZSsiLD8iKSwiLCIpLG49bi5yZXBsYWNlKC9eLHwsJC8sIiIpLHQuc3R5bGVbdV09bil9LF9vbk5hdGl2ZUVuZDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9ZS5zdGFtcChuKSxpPXQscz15Ll90b0NhbWVsKGkucHJvcGVydHlOYW1lKSxvPWkuZWxhcHNlZFRpbWUsdT15Ll9ub2RlQXR0cnNbcl0sZj11W3NdLGw9Zj9mLnRyYW5zaXRpb246bnVsbCxjLGg7bCYmKGwucmVtb3ZlUHJvcGVydHkocyksbC5fZW5kTmF0aXZlKHMpLGg9bC5fY29uZmlnW3NdLGM9e3R5cGU6InByb3BlcnR5RW5kIixwcm9wZXJ0eU5hbWU6cyxlbGFwc2VkVGltZTpvLGNvbmZpZzpofSxoJiZoLm9uJiZoLm9uLmVuZCYmaC5vbi5lbmQuY2FsbChlLm9uZShuKSxjKSxsLl9jb3VudDw9MCYmKGwuX2VuZChvKSxuLnN0eWxlW2FdPSIiKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS5fbm9kZTt0JiYodC5yZW1vdmVFdmVudExpc3RlbmVyKHAsZS5fb25OYXRpdmVFbmQsITEpLGUuX25vZGU9bnVsbCl9fSxlLlRyYW5zaXRpb249eSxlLlRyYW5zaXRpb25OYXRpdmU9eSxlLk5vZGUucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXkuX25vZGVBdHRyc1tlLnN0YW1wKHRoaXMuX25vZGUpXSxzPWk/aS50cmFuc2l0aW9ufHxudWxsOm51bGwsbyx1O2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7dHlwZW9mIG49PSJmdW5jdGlvbiImJihyPW4sbj1udWxsKSxvPXkuZnhbdF07aWYobiYmdHlwZW9mIG49PSJvYmplY3QiKXtuPWUuY2xvbmUobik7Zm9yKHUgaW4gbylvLmhhc093blByb3BlcnR5KHUpJiYodSBpbiBufHwoblt1XT1vW3VdKSl9ZWxzZSBuPW99ZWxzZSByPW4sbj10O3JldHVybiBzJiYhcy5fcnVubmluZz9zLmluaXQodGhpcyxuKTpzPW5ldyB5KHRoaXMuX25vZGUsbikscy5ydW4ociksdGhpc30sZS5Ob2RlLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5fc2hvdygpLHQmJmUuVHJhbnNpdGlvbiYmKHR5cGVvZiB0IT0ic3RyaW5nIiYmIXQucHVzaCYmKHR5cGVvZiBuPT0iZnVuY3Rpb24iJiYocj1uLG49dCksdD15LlNIT1dfVFJBTlNJVElPTiksdGhpcy50cmFuc2l0aW9uKHQsbixyKSksdGhpc30sZS5Ob2RlTGlzdC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5fbm9kZXMscz0wLG87d2hpbGUobz1pW3MrK10pZS5vbmUobykuc2hvdyh0LG4scik7cmV0dXJuIHRoaXN9O3ZhciBiPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0JiZ0LmNhbGwoZSksbiYmdHlwZW9mIG49PSJmdW5jdGlvbiImJm4uYXBwbHkoZS5fbm9kZSxhcmd1bWVudHMpfX07ZS5Ob2RlLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdCYmZS5UcmFuc2l0aW9uPyh0eXBlb2Ygbj09ImZ1bmN0aW9uIiYmKHI9bixuPW51bGwpLHI9Yih0aGlzLHRoaXMuX2hpZGUsciksdHlwZW9mIHQhPSJzdHJpbmciJiYhdC5wdXNoJiYodHlwZW9mIG49PSJmdW5jdGlvbiImJihyPW4sbj10KSx0PXkuSElERV9UUkFOU0lUSU9OKSx0aGlzLnRyYW5zaXRpb24odCxuLHIpKTp0aGlzLl9oaWRlKCksdGhpc30sZS5Ob2RlTGlzdC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5fbm9kZXMscz0wLG87d2hpbGUobz1pW3MrK10pZS5vbmUobykuaGlkZSh0LG4scik7cmV0dXJuIHRoaXN9LGUuTm9kZUxpc3QucHJvdG90eXBlCi50cmFuc2l0aW9uPWZ1bmN0aW9uKHQsbixyKXt2YXIgaT10aGlzLl9ub2RlcyxzPXRoaXMuc2l6ZSgpLG89MCxyPXI9PT0hMCx1O3doaWxlKHU9aVtvKytdKW88cyYmcj9lLm9uZSh1KS50cmFuc2l0aW9uKHQpOmUub25lKHUpLnRyYW5zaXRpb24odCxuKTtyZXR1cm4gdGhpc30sZS5Ob2RlLnByb3RvdHlwZS50b2dnbGVWaWV3PWZ1bmN0aW9uKHQsbixyKXt0aGlzLl90b2dnbGVzPXRoaXMuX3RvZ2dsZXN8fFtdLHI9YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV07aWYodHlwZW9mIHQhPSJzdHJpbmciKXtuPXQsdGhpcy5fdG9nZ2xlVmlldyhuLHIpO3JldHVybn1yZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiImJihuPXVuZGVmaW5lZCksdHlwZW9mIG49PSJ1bmRlZmluZWQiJiZ0IGluIHRoaXMuX3RvZ2dsZXMmJihuPSF0aGlzLl90b2dnbGVzW3RdKSxuPW4/MTowLG4/dGhpcy5fc2hvdygpOnI9Yih0aGlzLHRoaXMuX2hpZGUsciksdGhpcy5fdG9nZ2xlc1t0XT1uLHRoaXMudHJhbnNpdGlvbihlLlRyYW5zaXRpb24udG9nZ2xlc1t0XVtuXSxyKSx0aGlzfSxlLk5vZGVMaXN0LnByb3RvdHlwZS50b2dnbGVWaWV3PWZ1bmN0aW9uKHQsbixyKXt2YXIgaT10aGlzLl9ub2RlcyxzPTAsbzt3aGlsZShvPWlbcysrXSlvPWUub25lKG8pLG8udG9nZ2xlVmlldy5hcHBseShvLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGUubWl4KHkuZngse2ZhZGVPdXQ6e29wYWNpdHk6MCxkdXJhdGlvbjouNSxlYXNpbmc6ImVhc2Utb3V0In0sZmFkZUluOntvcGFjaXR5OjEsZHVyYXRpb246LjUsZWFzaW5nOiJlYXNlLWluIn0sc2l6ZU91dDp7aGVpZ2h0OjAsd2lkdGg6MCxkdXJhdGlvbjouNzUsZWFzaW5nOiJlYXNlLW91dCJ9LHNpemVJbjp7aGVpZ2h0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgic2Nyb2xsSGVpZ2h0IikrInB4In0sd2lkdGg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJzY3JvbGxXaWR0aCIpKyJweCJ9LGR1cmF0aW9uOi41LGVhc2luZzoiZWFzZS1pbiIsb246e3N0YXJ0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTdHlsZSgib3ZlcmZsb3ciKTtlIT09ImhpZGRlbiImJih0aGlzLnNldFN0eWxlKCJvdmVyZmxvdyIsImhpZGRlbiIpLHRoaXMuX3RyYW5zaXRpb25PdmVyZmxvdz1lKX0sZW5kOmZ1bmN0aW9uKCl7dGhpcy5fdHJhbnNpdGlvbk92ZXJmbG93JiYodGhpcy5zZXRTdHlsZSgib3ZlcmZsb3ciLHRoaXMuX3RyYW5zaXRpb25PdmVyZmxvdyksZGVsZXRlIHRoaXMuX3RyYW5zaXRpb25PdmVyZmxvdyl9fX19KSxlLm1peCh5LnRvZ2dsZXMse3NpemU6WyJzaXplT3V0Iiwic2l6ZUluIl0sZmFkZTpbImZhZGVPdXQiLCJmYWRlSW4iXX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJub2RlLXN0eWxlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInNlbGVjdG9yLWNzczIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49InBhcmVudE5vZGUiLHI9InRhZ05hbWUiLGk9ImF0dHJpYnV0ZXMiLHM9ImNvbWJpbmF0b3IiLG89InBzZXVkb3MiLHU9ZS5TZWxlY3RvcixhPXtfcmVSZWdFeHBUb2tlbnM6LyhbXF5cJFw/XFtcXVwqXCtcLVwuXChcKVx8XFxdKS8sU09SVF9SRVNVTFRTOiEwLF9pc1hNTDpmdW5jdGlvbigpe3ZhciB0PWUuY29uZmlnLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKS50YWdOYW1lIT09IkRJViI7cmV0dXJuIHR9KCksc2hvcnRoYW5kOnsiXFwjKC0/W19hLXowLTldK1stXFx3XFx1RTAwMF0qKSI6IltpZD0kMV0iLCJcXC4oLT9bX2Etel0rWy1cXHdcXHVFMDAwXSopIjoiW2NsYXNzTmFtZX49JDFdIn0sb3BlcmF0b3JzOnsiIjpmdW5jdGlvbih0LG4pe3JldHVybiBlLkRPTS5nZXRBdHRyaWJ1dGUodCxuKSE9PSIifSwifj0iOiIoPzpefFxccyspe3ZhbH0oPzpcXHMrfCQpIiwifD0iOiJee3ZhbH0tPyJ9LHBzZXVkb3M6eyJmaXJzdC1jaGlsZCI6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLl9jaGlsZHJlbih0W25dKVswXT09PXR9fSxfYnJ1dGVRdWVyeTpmdW5jdGlvbih0LG4scil7dmFyIGk9W10scz1bXSxvLGE9dS5fdG9rZW5pemUodCksZj1hW2EubGVuZ3RoLTFdLGw9ZS5ET00uX2dldERvYyhuKSxjLGgscCxkLHY7aWYoZil7aD1mLmlkLHA9Zi5jbGFzc05hbWUsZD1mLnRhZ05hbWV8fCIqIjtpZihuLmdldEVsZW1lbnRzQnlUYWdOYW1lKWgmJihuLmFsbHx8bi5ub2RlVHlwZT09PTl8fGUuRE9NLmluRG9jKG4pKT9zPWUuRE9NLmFsbEJ5SWQoaCxuKTpwP3M9bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHApOnM9bi5nZXRFbGVtZW50c0J5VGFnTmFtZShkKTtlbHNle289W10sYz1uLmZpcnN0Q2hpbGQsdj1kPT09IioiO3doaWxlKGMpe3doaWxlKGMpYy50YWdOYW1lPiJAIiYmKHZ8fGMudGFnTmFtZT09PWQpJiZzLnB1c2goYyksby5wdXNoKGMpLGM9Yy5maXJzdENoaWxkO3doaWxlKG8ubGVuZ3RoPjAmJiFjKWM9by5wb3AoKS5uZXh0U2libGluZ319cy5sZW5ndGgmJihpPXUuX2ZpbHRlck5vZGVzKHMsYSxyKSl9cmV0dXJuIGl9LF9maWx0ZXJOb2RlczpmdW5jdGlvbih0LG4scil7dmFyIGk9MCxzLG89bi5sZW5ndGgsYT1vLTEsZj1bXSxsPXRbMF0sYz1sLGg9ZS5TZWxlY3Rvci5nZXR0ZXJzLHAsZCx2LG0sZyx5LGIsdztmb3IoaT0wO2M9bD10W2krK107KXthPW8tMSxtPW51bGw7ZTp3aGlsZShjJiZjLnRhZ05hbWUpe3Y9blthXSxiPXYudGVzdHMscz1iLmxlbmd0aDtpZihzJiYhZyl3aGlsZSh3PWJbLS1zXSl7cD13WzFdLGhbd1swXV0/eT1oW3dbMF1dKGMsd1swXSk6KHk9Y1t3WzBdXSx3WzBdPT09InRhZ05hbWUiJiYhdS5faXNYTUwmJih5PXkudG9VcHBlckNhc2UoKSksdHlwZW9mIHkhPSJzdHJpbmciJiZ5IT09dW5kZWZpbmVkJiZ5LnRvU3RyaW5nP3k9eS50b1N0cmluZygpOnk9PT11bmRlZmluZWQmJmMuZ2V0QXR0cmlidXRlJiYoeT1jLmdldEF0dHJpYnV0ZSh3WzBdLDIpKSk7aWYocD09PSI9IiYmeSE9PXdbMl18fHR5cGVvZiBwIT0ic3RyaW5nIiYmcC50ZXN0JiYhcC50ZXN0KHkpfHwhcC50ZXN0JiZ0eXBlb2YgcD09ImZ1bmN0aW9uIiYmIXAoYyx3WzBdLHdbMl0pKXtpZihjPWNbbV0pd2hpbGUoYyYmKCFjLnRhZ05hbWV8fHYudGFnTmFtZSYmdi50YWdOYW1lIT09Yy50YWdOYW1lKSljPWNbbV07Y29udGludWUgZX19YS0tO2lmKCEhZ3x8IShkPXYuY29tYmluYXRvcikpe2YucHVzaChsKTtpZihyKXJldHVybiBmO2JyZWFrfW09ZC5heGlzLGM9Y1ttXTt3aGlsZShjJiYhYy50YWdOYW1lKWM9Y1ttXTtkLmRpcmVjdCYmKG09bnVsbCl9fXJldHVybiBsPWM9bnVsbCxmfSxjb21iaW5hdG9yczp7IiAiOntheGlzOiJwYXJlbnROb2RlIn0sIj4iOntheGlzOiJwYXJlbnROb2RlIixkaXJlY3Q6ITB9LCIrIjp7YXhpczoicHJldmlvdXNTaWJsaW5nIixkaXJlY3Q6ITB9fSxfcGFyc2Vyczpbe25hbWU6aSxyZTovXlx1RTAwMygtP1thLXpdK1tcd1wtXSopKyhbflx8XF5cJFwqIT1dPT8pP1snIl0/KFteXHVFMDA0JyJdKilbJyJdP1x1RTAwNC9pLGZuOmZ1bmN0aW9uKHQsbil7dmFyIHI9dFsyXXx8IiIsaT11Lm9wZXJhdG9ycyxzPXRbM10/dFszXS5yZXBsYWNlKC9cXC9nLCIiKToiIixvO2lmKHRbMV09PT0iaWQiJiZyPT09Ij0ifHx0WzFdPT09ImNsYXNzTmFtZSImJmUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmKHI9PT0ifj0ifHxyPT09Ij0iKSluLnByZWZpbHRlcj10WzFdLHRbM109cyxuW3RbMV1dPXRbMV09PT0iaWQiP3RbM106cztyIGluIGkmJihvPWlbcl0sdHlwZW9mIG89PSJzdHJpbmciJiYodFszXT1zLnJlcGxhY2UodS5fcmVSZWdFeHBUb2tlbnMsIlxcJDEiKSxvPW5ldyBSZWdFeHAoby5yZXBsYWNlKCJ7dmFsfSIsdFszXSkpKSx0WzJdPW8pO2lmKCFuLmxhc3R8fG4ucHJlZmlsdGVyIT09dFsxXSlyZXR1cm4gdC5zbGljZSgxKX19LHtuYW1lOnIscmU6L14oKD86LT9bX2Etel0rW1x3LV0qKXxcKikvaSxmbjpmdW5jdGlvbihlLHQpe3ZhciBuPWVbMV07dS5faXNYTUx8fChuPW4udG9VcHBlckNhc2UoKSksdC50YWdOYW1lPW47aWYobiE9PSIqIiYmKCF0Lmxhc3R8fHQucHJlZmlsdGVyKSlyZXR1cm5bciwiPSIsbl07dC5wcmVmaWx0ZXJ8fCh0LnByZWZpbHRlcj0idGFnTmFtZSIpfX0se25hbWU6cyxyZTovXlxzKihbPit+XXxccylccyovLGZuOmZ1bmN0aW9uKGUsdCl7fX0se25hbWU6byxyZTovXjooW1wtXHddKykoPzpcdUUwMDVbJyJdPyhbXlx1RTAwNV0qKVsnIl0/XHVFMDA2KSovaSxmbjpmdW5jdGlvbihlLHQpe3ZhciBuPXVbb11bZVsxXV07cmV0dXJuIG4/KGVbMl0mJihlWzJdPWVbMl0ucmVwbGFjZSgvXFwvZywiIikpLFtlWzJdLG5dKTohMX19XSxfZ2V0VG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJue3RhZ05hbWU6bnVsbCxpZDpudWxsLGNsYXNzTmFtZTpudWxsLGF0dHJpYnV0ZXM6e30sY29tYmluYXRvcjpudWxsLHRlc3RzOltdfX0sX3Rva2VuaXplOmZ1bmN0aW9uKHQpe3Q9dHx8IiIsdD11Ll9wYXJzZVNlbGVjdG9yKGUuTGFuZy50cmltKHQpKTt2YXIgbj11Ll9nZXRUb2tlbigpLHI9dCxpPVtdLG89ITEsYSxmLGwsYztlOmRve289ITE7Zm9yKGw9MDtjPXUuX3BhcnNlcnNbbCsrXTspaWYoYT1jLnJlLmV4ZWModCkpe2MubmFtZSE9PXMmJihuLnNlbGVjdG9yPXQpLHQ9dC5yZXBsYWNlKGFbMF0sIiIpLHQubGVuZ3RofHwobi5sYXN0PSEwKSx1Ll9hdHRyRmlsdGVyc1thWzFdXSYmKGFbMV09dS5fYXR0ckZpbHRlcnNbYVsxXV0pLGY9Yy5mbihhLG4pO2lmKGY9PT0hMSl7bz0hMTticmVhayBlfWYmJm4udGVzdHMucHVzaChmKTtpZighdC5sZW5ndGh8fGMubmFtZT09PXMpaS5wdXNoKG4pLG49dS5fZ2V0VG9rZW4obiksYy5uYW1lPT09cyYmKG4uY29tYmluYXRvcj1lLlNlbGVjdG9yLmNvbWJpbmF0b3JzW2FbMV1dKTtvPSEwfX13aGlsZShvJiZ0Lmxlbmd0aCk7aWYoIW98fHQubGVuZ3RoKWk9W107cmV0dXJuIGl9LF9yZXBsYWNlTWFya2VyczpmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoL1xbL2csIlx1ZTAwMyIpLGU9ZS5yZXBsYWNlKC9cXS9nLCJcdWUwMDQiKSxlPWUucmVwbGFjZSgvXCgvZywiXHVlMDA1IiksZT1lLnJlcGxhY2UoL1wpL2csIlx1ZTAwNiIpLGV9LF9yZXBsYWNlU2hvcnRoYW5kOmZ1bmN0aW9uKHQpe3ZhciBuPWUuU2VsZWN0b3Iuc2hvcnRoYW5kLHI7Zm9yKHIgaW4gbiluLmhhc093blByb3BlcnR5KHIpJiYodD10LnJlcGxhY2UobmV3IFJlZ0V4cChyLCJnaSIpLG5bcl0pKTtyZXR1cm4gdH0sX3BhcnNlU2VsZWN0b3I6ZnVuY3Rpb24odCl7dmFyIG49ZS5TZWxlY3Rvci5fcmVwbGFjZVNlbGVjdG9yKHQpLHQ9bi5zZWxlY3RvcjtyZXR1cm4gdD1lLlNlbGVjdG9yLl9yZXBsYWNlU2hvcnRoYW5kKHQpLHQ9ZS5TZWxlY3Rvci5fcmVzdG9yZSgiYXR0ciIsdCxuLmF0dHJzKSx0PWUuU2VsZWN0b3IuX3Jlc3RvcmUoInBzZXVkbyIsdCxuLnBzZXVkb3MpLHQ9ZS5TZWxlY3Rvci5fcmVwbGFjZU1hcmtlcnModCksdD1lLlNlbGVjdG9yLl9yZXN0b3JlKCJlc2MiLHQsbi5lc2MpLHR9LF9hdHRyRmlsdGVyczp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGdldHRlcnM6e2hyZWY6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5ET00uZ2V0QXR0cmlidXRlKHQsbil9LGlkOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuRE9NLmdldElkKHQpfX19O2UubWl4KGUuU2VsZWN0b3IsYSwhMCksZS5TZWxlY3Rvci5nZXR0ZXJzLnNyYz1lLlNlbGVjdG9yLmdldHRlcnMucmVsPWUuU2VsZWN0b3IuZ2V0dGVycy5ocmVmLGUuU2VsZWN0b3IudXNlTmF0aXZlJiZlLmNvbmZpZy5kb2MucXVlcnlTZWxlY3RvciYmKGUuU2VsZWN0b3Iuc2hvcnRoYW5kWyJcXC4oLT9bX2Etel0rWy1cXHddKikiXT0iW2NsYXNzfj0kMV0iKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsic2VsZWN0b3ItbmF0aXZlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInNlbGVjdG9yLWNzczMiLGZ1bmN0aW9uKGUsdCl7ZS5TZWxlY3Rvci5fcmVOdGg9L14oPzooW1wtXT9cZCopKG4pezF9fChvZGR8ZXZlbikkKSooW1wtK10/XGQqKSQvLGUuU2VsZWN0b3IuX2dldE50aD1mdW5jdGlvbih0LG4scixpKXtlLlNlbGVjdG9yLl9yZU50aC50ZXN0KG4pO3ZhciBzPXBhcnNlSW50KFJlZ0V4cC4kMSwxMCksbz1SZWdFeHAuJDIsdT1SZWdFeHAuJDMsYT1wYXJzZUludChSZWdFeHAuJDQsMTApfHwwLGY9W10sbD1lLkRPTS5fY2hpbGRyZW4odC5wYXJlbnROb2RlLHIpLGM7dT8ocz0yLGM9IisiLG89Im4iLGE9dT09PSJvZGQiPzE6MCk6aXNOYU4ocykmJihzPW8/MTowKTtpZihzPT09MClyZXR1cm4gaSYmKGE9bC5sZW5ndGgtYSsxKSxsW2EtMV09PT10PyEwOiExO3M8MCYmKGk9ISFpLHM9TWF0aC5hYnMocykpO2lmKCFpKXtmb3IodmFyIGg9YS0xLHA9bC5sZW5ndGg7aDxwO2grPXMpaWYoaD49MCYmbFtoXT09PXQpcmV0dXJuITB9ZWxzZSBmb3IodmFyIGg9bC5sZW5ndGgtYSxwPWwubGVuZ3RoO2g+PTA7aC09cylpZihoPHAmJmxbaF09PT10KXJldHVybiEwO3JldHVybiExfSxlLm1peChlLlNlbGVjdG9yLnBzZXVkb3Mse3Jvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1lLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fSwibnRoLWNoaWxkIjpmdW5jdGlvbih0LG4pe3JldHVybiBlLlNlbGVjdG9yLl9nZXROdGgodCxuKX0sIm50aC1sYXN0LWNoaWxkIjpmdW5jdGlvbih0LG4pe3JldHVybiBlLlNlbGVjdG9yLl9nZXROdGgodCxuLG51bGwsITApfSwibnRoLW9mLXR5cGUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuU2VsZWN0b3IuX2dldE50aCh0LG4sdC50YWdOYW1lKX0sIm50aC1sYXN0LW9mLXR5cGUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuU2VsZWN0b3IuX2dldE50aCh0LG4sdC50YWdOYW1lLCEwKX0sImxhc3QtY2hpbGQiOmZ1bmN0aW9uKHQpe3ZhciBuPWUuRE9NLl9jaGlsZHJlbih0LnBhcmVudE5vZGUpO3JldHVybiBuW24ubGVuZ3RoLTFdPT09dH0sImZpcnN0LW9mLXR5cGUiOmZ1bmN0aW9uKHQpe3JldHVybiBlLkRPTS5fY2hpbGRyZW4odC5wYXJlbnROb2RlLHQudGFnTmFtZSlbMF09PT10fSwibGFzdC1vZi10eXBlIjpmdW5jdGlvbih0KXt2YXIgbj1lLkRPTS5fY2hpbGRyZW4odC5wYXJlbnROb2RlLHQudGFnTmFtZSk7cmV0dXJuIG5bbi5sZW5ndGgtMV09PT10fSwib25seS1jaGlsZCI6ZnVuY3Rpb24odCl7dmFyIG49ZS5ET00uX2NoaWxkcmVuKHQucGFyZW50Tm9kZSk7cmV0dXJuIG4ubGVuZ3RoPT09MSYmblswXT09PXR9LCJvbmx5LW9mLXR5cGUiOmZ1bmN0aW9uKHQpe3ZhciBuPWUuRE9NLl9jaGlsZHJlbih0LnBhcmVudE5vZGUsdC50YWdOYW1lKTtyZXR1cm4gbi5sZW5ndGg9PT0xJiZuWzBdPT09dH0sZW1wdHk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hpbGROb2Rlcy5sZW5ndGg9PT0wfSxub3Q6ZnVuY3Rpb24odCxuKXtyZXR1cm4hZS5TZWxlY3Rvci50ZXN0KHQsbil9LGNvbnRhaW5zOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbm5lclRleHR8fGUudGV4dENvbnRlbnR8fCIiO3JldHVybiBuLmluZGV4T2YodCk+LTF9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hlY2tlZD09PSEwfHxlLnNlbGVjdGVkPT09ITB9LGVuYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQhPT11bmRlZmluZWQmJiFlLmRpc2FibGVkfSxkaXNhYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZH19KSxlLm1peChlLlNlbGVjdG9yLm9wZXJhdG9ycyx7Il49IjoiXnt2YWx9IiwiJD0iOiJ7dmFsfSQiLCIqPSI6Int2YWx9In0pLGUuU2VsZWN0b3IuY29tYmluYXRvcnNbIn4iXT17YXhpczoicHJldmlvdXNTaWJsaW5nIn19LCIzLjE3LjIiLHtyZXF1aXJlczpbInNlbGVjdG9yLW5hdGl2ZSIsInNlbGVjdG9yLWNzczIiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiZG9tLXN0eWxlLWllIixmdW5jdGlvbihlLHQpe3ZhciBuPSJoYXNMYXlvdXQiLHI9InB4IixpPSJmaWx0ZXIiLHM9ImZpbHRlcnMiLG89Im9wYWNpdHkiLHU9ImF1dG8iLGE9ImJvcmRlcldpZHRoIixmPSJib3JkZXJUb3BXaWR0aCIsbD0iYm9yZGVyUmlnaHRXaWR0aCIsYz0iYm9yZGVyQm90dG9tV2lkdGgiLGg9ImJvcmRlckxlZnRXaWR0aCIscD0id2lkdGgiLGQ9ImhlaWdodCIsdj0idHJhbnNwYXJlbnQiLG09InZpc2libGUiLGc9ImdldENvbXB1dGVkU3R5bGUiLHk9ZS5jb25maWcuZG9jLmRvY3VtZW50RWxlbWVudCxiPWUuRmVhdHVyZXMudGVzdCx3PWUuRmVhdHVyZXMuYWRkLEU9L14oXGRbLlxkXSopKyhlbXxleHxweHxnZHxyZW18dnd8dmh8dm18Y2h8bW18Y218aW58cHR8cGN8ZGVnfHJhZHxtc3xzfGh6fGtoenwlKXsxfT8vaSxTPWUuVUEuaWU+PTgseD1mdW5jdGlvbihlKXtyZXR1cm4gZS5jdXJyZW50U3R5bGV8fGUuc3R5bGV9LFQ9e0NVU1RPTV9TVFlMRVM6e30sZ2V0OmZ1bmN0aW9uKHQsbil7dmFyIGk9IiIscztyZXR1cm4gdCYmKHM9eCh0KVtuXSxuPT09byYmZS5ET00uQ1VTVE9NX1NUWUxFU1tvXT9pPWUuRE9NLkNVU1RPTV9TVFlMRVNbb10uZ2V0KHQpOiFzfHxzLmluZGV4T2YmJnMuaW5kZXhPZihyKT4tMT9pPXM6ZS5ET00uSUUuQ09NUFVURURbbl0/aT1lLkRPTS5JRS5DT01QVVRFRFtuXSh0LG4pOkUudGVzdChzKT9pPVQuZ2V0UGl4ZWwodCxuKStyOmk9cyksaX0sc2l6ZU9mZnNldHM6e3dpZHRoOlsiTGVmdCIsIlJpZ2h0Il0saGVpZ2h0OlsiVG9wIiwiQm90dG9tIl0sdG9wOlsiVG9wIl0sYm90dG9tOlsiQm90dG9tIl19LGdldE9mZnNldDpmdW5jdGlvbihlLHQpe3ZhciBuPXgoZSlbdF0saT10LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpLHM9InBpeGVsIitpLG89VC5zaXplT2Zmc2V0c1t0XSxhPWUub3duZXJEb2N1bWVudC5jb21wYXRNb2RlLGY9IiI7cmV0dXJuIG49PT11fHxuLmluZGV4T2YoIiUiKT4tMT8oZj1lWyJvZmZzZXQiK2ldLGEhPT0iQmFja0NvbXBhdCImJihvWzBdJiYoZi09VC5nZXRQaXhlbChlLCJwYWRkaW5nIitvWzBdKSxmLT1ULmdldEJvcmRlcldpZHRoKGUsImJvcmRlciIrb1swXSsiV2lkdGgiLDEpKSxvWzFdJiYoZi09VC5nZXRQaXhlbChlLCJwYWRkaW5nIitvWzFdKSxmLT1ULmdldEJvcmRlcldpZHRoKGUsImJvcmRlciIrb1sxXSsiV2lkdGgiLDEpKSkpOighZS5zdHlsZVtzXSYmIWUuc3R5bGVbdF0mJihlLnN0eWxlW3RdPW4pLGY9ZS5zdHlsZVtzXSksZityfSxib3JkZXJNYXA6e3RoaW46Uz8iMXB4IjoiMnB4IixtZWRpdW06Uz8iM3B4IjoiNHB4Iix0aGljazpTPyI1cHgiOiI2cHgifSxnZXRCb3JkZXJXaWR0aDpmdW5jdGlvbihlLHQsbil7dmFyIGk9ZS5jdXJyZW50U3R5bGVbdF07cmV0dXJuIGkuaW5kZXhPZihyKTwwJiYoVC5ib3JkZXJNYXBbaV0mJmUuY3VycmVudFN0eWxlLmJvcmRlclN0eWxlIT09Im5vbmUiP2k9VC5ib3JkZXJNYXBbaV06aT0wKSxuP3BhcnNlRmxvYXQoaSk6aX0sZ2V0UGl4ZWw6ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsLHI9eChlKSxpPXIucmlnaHQscz1yW3RdO3JldHVybiBlLnN0eWxlLnJpZ2h0PXMsbj1lLnN0eWxlLnBpeGVsUmlnaHQsZS5zdHlsZS5yaWdodD1pLG59LGdldE1hcmdpbjpmdW5jdGlvbihlLHQpe3ZhciBuLGk9eChlKTtyZXR1cm4gaVt0XT09PXU/bj0wOm49VC5nZXRQaXhlbChlLHQpLG4rcn0sZ2V0VmlzaWJpbGl0eTpmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKChuPWUuY3VycmVudFN0eWxlKSYmblt0XT09PSJpbmhlcml0IillPWUucGFyZW50Tm9kZTtyZXR1cm4gbj9uW3RdOm19LGdldENvbG9yOmZ1bmN0aW9uKHQsbil7dmFyIHI9eCh0KVtuXTtyZXR1cm4oIXJ8fHI9PT12KSYmZS5ET00uZWxlbWVudEJ5QXhpcyh0LCJwYXJlbnROb2RlIixudWxsLGZ1bmN0aW9uKGUpe3I9eChlKVtuXTtpZihyJiZyIT09dilyZXR1cm4gdD1lLCEwfSksZS5Db2xvci50b1JHQihyKX0sZ2V0Qm9yZGVyQ29sb3I6ZnVuY3Rpb24odCxuKXt2YXIgcj14KHQpLGk9cltuXXx8ci5jb2xvcjtyZXR1cm4gZS5Db2xvci50b1JHQihlLkNvbG9yLnRvSGV4KGkpKX19LE49e307dygic3R5bGUiLCJjb21wdXRlZFN0eWxlIix7dGVzdDpmdW5jdGlvbigpe3JldHVybiJnZXRDb21wdXRlZFN0eWxlImluIGUuY29uZmlnLndpbn19KSx3KCJzdHlsZSIsIm9wYWNpdHkiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIm9wYWNpdHkiaW4geS5zdHlsZX19KSx3KCJzdHlsZSIsImZpbHRlciIse3Rlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4iZmlsdGVycyJpbiB5fX0pLCFiKCJzdHlsZSIsIm9wYWNpdHkiKSYmYigic3R5bGUiLCJmaWx0ZXIiKSYmKGUuRE9NLkNVU1RPTV9TVFlMRVNbb109e2dldDpmdW5jdGlvbihlKXt2YXIgdD0xMDA7dHJ5e3Q9ZVtzXVsiRFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEiXVtvXX1jYXRjaChuKXt0cnl7dD1lW3NdKCJhbHBoYSIpW29dfWNhdGNoKHIpe319cmV0dXJuIHQvMTAwfSxzZXQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBzLHU9eChlKSxhPXVbaV07cj1yfHxlLnN0eWxlLHQ9PT0iIiYmKHM9byBpbiB1P3Vbb106MSx0PXMpLHR5cGVvZiBhPT0ic3RyaW5nIiYmKHJbaV09YS5yZXBsYWNlKC9hbHBoYShbXildKlwpKS9naSwiIikrKHQ8PTE/ImFscGhhKCIrbysiPSIrdCoxMDArIikiOiIiKSxyW2ldfHxyLnJlbW92ZUF0dHJpYnV0ZShpKSx1W25dfHwoci56b29tPTEpKX19KTt0cnl7ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLmhlaWdodD0iLTFweCJ9Y2F0Y2goQyl7ZS5ET00uQ1VTVE9NX1NUWUxFUy5oZWlnaHQ9e3NldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9cGFyc2VGbG9hdCh0KTtpZihyPj0wfHx0PT09ImF1dG8ifHx0PT09IiIpbi5oZWlnaHQ9dH19LGUuRE9NLkNVU1RPTV9TVFlMRVMud2lkdGg9e3NldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9cGFyc2VGbG9hdCh0KTtpZihyPj0wfHx0PT09ImF1dG8ifHx0PT09IiIpbi53aWR0aD10fX19Yigic3R5bGUiLCJjb21wdXRlZFN0eWxlIil8fChOW3BdPU5bZF09VC5nZXRPZmZzZXQsTi5jb2xvcj1OLmJhY2tncm91bmRDb2xvcj1ULmdldENvbG9yLE5bYV09TltmXT1OW2xdPU5bY109TltoXT1ULmdldEJvcmRlcldpZHRoLE4ubWFyZ2luVG9wPU4ubWFyZ2luUmlnaHQ9Ti5tYXJnaW5Cb3R0b209Ti5tYXJnaW5MZWZ0PVQuZ2V0TWFyZ2luLE4udmlzaWJpbGl0eT1ULmdldFZpc2liaWxpdHksTi5ib3JkZXJDb2xvcj1OLmJvcmRlclRvcENvbG9yPU4uYm9yZGVyUmlnaHRDb2xvcj1OLmJvcmRlckJvdHRvbUNvbG9yPU4uYm9yZGVyTGVmdENvbG9yPVQuZ2V0Qm9yZGVyQ29sb3IsZS5ET01bZ109VC5nZXQsZS5uYW1lc3BhY2UoIkRPTS5JRSIpLGUuRE9NLklFLkNPTVBVVEVEPU4sZS5ET00uSUUuQ29tcHV0ZWRTdHlsZT1UKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZG9tLXN0eWxlIiwiY29sb3ItYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJlc2NhcGUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImI3gyNzsiLCIvIjoiJiN4MkY7IiwiYCI6IiYjeDYwOyJ9LHI9e2h0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UoL1smPD4iJ1wvYF0vZyxyLl9odG1sUmVwbGFjZXIpfSxyZWdleDpmdW5jdGlvbihlKXtyZXR1cm4oZSsiIikucmVwbGFjZSgvW1wtJFxeKigpK1xbXF17fXxcXCwuP1xzXS9nLCJcXCQmIil9LF9odG1sUmVwbGFjZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV19fTtyLnJlZ2V4cD1yLnJlZ2V4LGUuRXNjYXBlPXJ9LCIzLjE3LjIiLHtyZXF1aXJlczpbInl1aS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImF0dHJpYnV0ZS1jb3JlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGIoZSx0LG4pe3RoaXMuX3l1aWV2dD1udWxsLHRoaXMuX2luaXRBdHRySG9zdChlLHQsbil9ZS5TdGF0ZT1mdW5jdGlvbigpe3RoaXMuZGF0YT17fX0sZS5TdGF0ZS5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5kYXRhW2VdO3J8fChyPXRoaXMuZGF0YVtlXT17fSksclt0XT1ufSxhZGRBbGw6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmRhdGFbZV0scjtufHwobj10aGlzLmRhdGFbZV09e30pO2ZvcihyIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09dFtyXSl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZGF0YVtlXTtuJiZkZWxldGUgblt0XX0scmVtb3ZlQWxsOmZ1bmN0aW9uKHQsbil7dmFyIHI7bj9lLmVhY2gobixmdW5jdGlvbihlLG4pe3RoaXMucmVtb3ZlKHQsdHlwZW9mIG49PSJzdHJpbmciP246ZSl9LHRoaXMpOihyPXRoaXMuZGF0YSx0IGluIHImJmRlbGV0ZSByW3RdKX0sZ2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5kYXRhW2VdO2lmKG4pcmV0dXJuIG5bdF19LGdldEFsbDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZGF0YVtlXSxyLGk7aWYodClpPW47ZWxzZSBpZihuKXtpPXt9O2ZvcihyIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShyKSYmKGlbcl09bltyXSl9cmV0dXJuIGl9fTt2YXIgbj1lLk9iamVjdCxyPWUuTGFuZyxpPSIuIixzPSJnZXR0ZXIiLG89InNldHRlciIsdT0icmVhZE9ubHkiLGE9IndyaXRlT25jZSIsZj0iaW5pdE9ubHkiLGw9InZhbGlkYXRvciIsYz0idmFsdWUiLGg9InZhbHVlRm4iLHA9ImxhenlBZGQiLGQ9ImFkZGVkIix2PSJfYnlwYXNzUHJveHkiLG09ImluaXRWYWx1ZSIsZz0ibGF6eSIseTtiLklOVkFMSURfVkFMVUU9e30seT1iLklOVkFMSURfVkFMVUUsYi5fQVRUUl9DRkc9W28scyxsLGMsaCxhLHUscCx2XSxiLnByb3RlY3RBdHRycz1mdW5jdGlvbih0KXtpZih0KXt0PWUubWVyZ2UodCk7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZS5tZXJnZSh0W25dKSl9cmV0dXJuIHR9LGIucHJvdG90eXBlPXtfaW5pdEF0dHJIb3N0OmZ1bmN0aW9uKHQsbixyKXt0aGlzLl9zdGF0ZT1uZXcgZS5TdGF0ZSx0aGlzLl9pbml0QXR0cnModCxuLHIpfSxhZGRBdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLGk9ci5fc3RhdGUscz1pLmRhdGEsbyx1LGE7dD10fHx7fSxwIGluIHQmJihuPXRbcF0pLHU9aS5nZXQoZSxkKTtpZihuJiYhdSlpLmRhdGFbZV09e2xhenk6dCxhZGRlZDohMH07ZWxzZSBpZighdXx8dC5pc0xhenlBZGQpYT1jIGluIHQsYSYmKG89dC52YWx1ZSx0LnZhbHVlPXVuZGVmaW5lZCksdC5hZGRlZD0hMCx0LmluaXRpYWxpemluZz0hMCxzW2VdPXQsYSYmci5zZXQoZSxvKSx0LmluaXRpYWxpemluZz0hMTtyZXR1cm4gcn0sYXR0ckFkZGVkOmZ1bmN0aW9uKGUpe3JldHVybiEhdGhpcy5fc3RhdGUuZ2V0KGUsZCl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZ2V0QXR0cihlKX0sX2lzTGF6eUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3N0YXRlLmdldChlLGcpfSxfYWRkTGF6eUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9zdGF0ZTt0PXR8fG4uZ2V0KGUsZyksdCYmKG4uZGF0YVtlXS5sYXp5PXVuZGVmaW5lZCx0LmlzTGF6eUFkZD0hMCx0aGlzLmFkZEF0dHIoZSx0KSl9LHNldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuX3NldEF0dHIoZSx0LG4pfSxfc2V0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fc2V0QXR0cihlLHQsbiwhMCl9LF9zZXRBdHRyOmZ1bmN0aW9uKHQscixzLG8pe3ZhciB1PSEwLGE9dGhpcy5fc3RhdGUsbD10aGlzLl9zdGF0ZVByb3h5LGM9dGhpcy5fdENmZ3MsaCxwLGQsdixtLGcseTtyZXR1cm4gdC5pbmRleE9mKGkpIT09LTEmJihkPXQsdj10LnNwbGl0KGkpLHQ9di5zaGlmdCgpKSxjJiZjW3RdJiZ0aGlzLl9hZGRPdXRPZk9yZGVyKHQsY1t0XSksaD1hLmRhdGFbdF18fHt9LGgubGF6eSYmKGg9aC5sYXp5LHRoaXMuX2FkZExhenlBdHRyKHQsaCkpLHA9aC52YWx1ZT09PXVuZGVmaW5lZCxsJiZ0IGluIGwmJiFoLl9ieXBhc3NQcm94eSYmKHA9ITEpLGc9aC53cml0ZU9uY2UseT1oLmluaXRpYWxpemluZywhcCYmIW8mJihnJiYodT0hMSksaC5yZWFkT25seSYmKHU9ITEpKSwheSYmIW8mJmc9PT1mJiYodT0hMSksdSYmKHB8fChtPXRoaXMuZ2V0KHQpKSx2JiYocj1uLnNldFZhbHVlKGUuY2xvbmUobSksdixyKSxyPT09dW5kZWZpbmVkJiYodT0hMSkpLHUmJighdGhpcy5fZmlyZUF0dHJDaGFuZ2V8fHk/dGhpcy5fc2V0QXR0clZhbCh0LGQsbSxyLHMsaCk6dGhpcy5fZmlyZUF0dHJDaGFuZ2UodCxkLG0scixzLGgpKSksdGhpc30sX2FkZE91dE9mT3JkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtuW2VdPXQsZGVsZXRlIHRoaXMuX3RDZmdzW2VdLHRoaXMuX2FkZEF0dHJzKG4sdGhpcy5fdFZhbHMpfSxfZ2V0QXR0cjpmdW5jdGlvbihlKXt2YXIgdD1lLHI9dGhpcy5fdENmZ3MscyxvLHUsYTtyZXR1cm4gZS5pbmRleE9mKGkpIT09LTEmJihzPWUuc3BsaXQoaSksZT1zLnNoaWZ0KCkpLHImJnJbZV0mJnRoaXMuX2FkZE91dE9mT3JkZXIoZSxyW2VdKSxhPXRoaXMuX3N0YXRlLmRhdGFbZV18fHt9LGEubGF6eSYmKGE9YS5sYXp5LHRoaXMuX2FkZExhenlBdHRyKGUsYSkpLHU9dGhpcy5fZ2V0U3RhdGVWYWwoZSxhKSxvPWEuZ2V0dGVyLG8mJiFvLmNhbGwmJihvPXRoaXNbb10pLHU9bz9vLmNhbGwodGhpcyx1LHQpOnUsdT1zP24uZ2V0VmFsdWUodSxzKTp1LHV9LF9nZXRTdGF0ZVZhbDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX3N0YXRlUHJveHk7cmV0dXJuIHR8fCh0PXRoaXMuX3N0YXRlLmdldEFsbChlKXx8e30pLG4mJmUgaW4gbiYmIXQuX2J5cGFzc1Byb3h5P25bZV06dC52YWx1ZX0sX3NldFN0YXRlVmFsOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fc3RhdGVQcm94eTtuJiZlIGluIG4mJiF0aGlzLl9zdGF0ZS5nZXQoZSx2KT9uW2VdPXQ6dGhpcy5fc3RhdGUuYWRkKGUsYyx0KX0sX3NldEF0dHJWYWw6ZnVuY3Rpb24oZSx0LG4saSxzLG8pe3ZhciB1PXRoaXMsYT0hMCxmPW98fHRoaXMuX3N0YXRlLmRhdGFbZV18fHt9LGw9Zi52YWxpZGF0b3IsYz1mLnNldHRlcixoPWYuaW5pdGlhbGl6aW5nLHA9dGhpcy5fZ2V0U3RhdGVWYWwoZSxmKSxkPXR8fGUsdixnO3JldHVybiBsJiYobC5jYWxsfHwobD10aGlzW2xdKSxsJiYoZz1sLmNhbGwodSxpLGQscyksIWcmJmgmJihpPWYuZGVmYXVsdFZhbHVlLGc9ITApKSksIWx8fGc/KGMmJihjLmNhbGx8fChjPXRoaXNbY10pLGMmJih2PWMuY2FsbCh1LGksZCxzKSx2PT09eT9oP2k9Zi5kZWZhdWx0VmFsdWU6YT0hMTp2IT09dW5kZWZpbmVkJiYoaT12KSkpLGEmJighdCYmaT09PXAmJiFyLmlzT2JqZWN0KGkpP2E9ITE6KG0gaW4gZnx8KGYuaW5pdFZhbHVlPWkpLHUuX3NldFN0YXRlVmFsKGUsaSkpKSk6YT0hMSxhfSxzZXRBdHRyczpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9zZXRBdHRycyhlLHQpfSxfc2V0QXR0cnM6ZnVuY3Rpb24oZSx0KXt2YXIgbjtmb3IobiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJnRoaXMuc2V0KG4sZVtuXSx0KTtyZXR1cm4gdGhpc30sZ2V0QXR0cnM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2dldEF0dHJzKGUpfSxfZ2V0QXR0cnM6ZnVuY3Rpb24oZSl7dmFyIHQ9e30scixpLHMsbz1lPT09ITA7aWYoIWV8fG8pZT1uLmtleXModGhpcy5fc3RhdGUuZGF0YSk7Zm9yKGk9MCxzPWUubGVuZ3RoO2k8cztpKyspe3I9ZVtpXTtpZighb3x8dGhpcy5fZ2V0U3RhdGVWYWwocikhPXRoaXMuX3N0YXRlLmdldChyLG0pKXRbcl09dGhpcy5nZXQocil9cmV0dXJuIHR9LGFkZEF0dHJzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZSYmKHRoaXMuX3RDZmdzPWUsdGhpcy5fdFZhbHM9dD90aGlzLl9ub3JtQXR0clZhbHModCk6bnVsbCx0aGlzLl9hZGRBdHRycyhlLHRoaXMuX3RWYWxzLG4pLHRoaXMuX3RDZmdzPXRoaXMuX3RWYWxzPW51bGwpLHRoaXN9LF9hZGRBdHRyczpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fdENmZ3MsaT10aGlzLl90VmFscyxzLG8sdTtmb3IocyBpbiBlKWUuaGFzT3duUHJvcGVydHkocykmJihvPWVbc10sby5kZWZhdWx0VmFsdWU9by52YWx1ZSx1PXRoaXMuX2dldEF0dHJJbml0VmFsKHMsbyxpKSx1IT09dW5kZWZpbmVkJiYoby52YWx1ZT11KSxyW3NdJiYocltzXT11bmRlZmluZWQpLHRoaXMuYWRkQXR0cihzLG8sbikpfSxfcHJvdGVjdEF0dHJzOmIucHJvdGVjdEF0dHJzLF9ub3JtQXR0clZhbHM6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLHMsbyx1O2lmKCFlKXJldHVybiBudWxsO3Q9e307Zm9yKHUgaW4gZSllLmhhc093blByb3BlcnR5KHUpJiYodS5pbmRleE9mKGkpIT09LTE/KHI9dS5zcGxpdChpKSxzPXIuc2hpZnQoKSxuPW58fHt9LG89bltzXT1uW3NdfHxbXSxvW28ubGVuZ3RoXT17cGF0aDpyLHZhbHVlOmVbdV19KTp0W3VdPWVbdV0pO3JldHVybntzaW1wbGU6dCxjb21wbGV4Om59fSxfZ2V0QXR0ckluaXRWYWw6ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPXQudmFsdWUscz10LnZhbHVlRm4sbyx1PSExLGE9dC5yZWFkT25seSxmLGwsYyxoLHAsZCx2OyFhJiZyJiYoZj1yLnNpbXBsZSxmJiZmLmhhc093blByb3BlcnR5KGUpJiYoaT1mW2VdLHU9ITApKSxzJiYhdSYmKHMuY2FsbHx8KHM9dGhpc1tzXSkscyYmKG89cy5jYWxsKHRoaXMsZSksaT1vKSk7aWYoIWEmJnIpe2w9ci5jb21wbGV4O2lmKGwmJmwuaGFzT3duUHJvcGVydHkoZSkmJmkhPT11bmRlZmluZWQmJmkhPT1udWxsKXt2PWxbZV07Zm9yKGM9MCxoPXYubGVuZ3RoO2M8aDsrK2MpcD12W2NdLnBhdGgsZD12W2NdLnZhbHVlLG4uc2V0VmFsdWUoaSxwLGQpfX1yZXR1cm4gaX0sX2luaXRBdHRyczpmdW5jdGlvbih0LG4scil7dD10fHx0aGlzLmNvbnN0cnVjdG9yLkFUVFJTO3ZhciBpPWUuQmFzZSxzPWUuQmFzZUNvcmUsbz1pJiZlLmluc3RhbmNlT2YodGhpcyxpKSx1PSFvJiZzJiZlLmluc3RhbmNlT2YodGhpcyxzKTt0JiYhbyYmIXUmJnRoaXMuYWRkQXR0cnMoZS5BdHRyaWJ1dGVDb3JlLnByb3RlY3RBdHRycyh0KSxuLHIpfX0sZS5BdHRyaWJ1dGVDb3JlPWJ9LCIzLjE3LjIiLHtyZXF1aXJlczpbIm9vcCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1jdXN0b20tY29tcGxleCIsZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5PYmplY3QscyxvPXt9LHU9ZS5DdXN0b21FdmVudC5wcm90b3R5cGUsYT1lLkV2ZW50VGFyZ2V0LnByb3RvdHlwZSxmPWZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKG4gaW4gdClyLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX07ZS5FdmVudEZhY2FkZT1mdW5jdGlvbihlLHQpe2V8fChlPW8pLHRoaXMuX2V2ZW50PWUsdGhpcy5kZXRhaWxzPWUuZGV0YWlscyx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuX3R5cGU9ZS50eXBlLHRoaXMudGFyZ2V0PWUudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD10LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXR9LGUubWl4KGUuRXZlbnRGYWNhZGUucHJvdG90eXBlLHtzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLl9ldmVudC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BwZWQ9MX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wcGVkPTJ9LHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQucHJldmVudERlZmF1bHQoKSx0aGlzLnByZXZlbnRlZD0xfSxoYWx0OmZ1bmN0aW9uKGUpe3RoaXMuX2V2ZW50LmhhbHQoZSksdGhpcy5wcmV2ZW50ZWQ9MSx0aGlzLnN0b3BwZWQ9ZT8yOjF9fSksdS5maXJlQ29tcGxleD1mdW5jdGlvbih0KXt2YXIgbixyLGkscyxvLHU9ITAsYSxmLGwsYyxoLHAsZCx2LG0sZz10aGlzLHk9Zy5ob3N0fHxnLGIsdyxFPWcuc3RhY2ssUz15Ll95dWlldnQseDtpZihFJiZnLnF1ZXVhYmxlJiZnLnR5cGUhPT1FLm5leHQudHlwZSlyZXR1cm4gRS5xdWV1ZXx8KEUucXVldWU9W10pLEUucXVldWUucHVzaChbZyx0XSksITA7eD1nLmhhc1N1YnMoKXx8Uy5oYXNUYXJnZXRzfHxnLmJyb2FkY2FzdCxnLnRhcmdldD1nLnRhcmdldHx8eSxnLmN1cnJlbnRUYXJnZXQ9eSxnLmRldGFpbHM9dC5jb25jYXQoKTtpZih4KXtuPUV8fHtpZDpnLmlkLG5leHQ6ZyxzaWxlbnQ6Zy5zaWxlbnQsc3RvcHBlZDowLHByZXZlbnRlZDowLGJ1YmJsaW5nOm51bGwsdHlwZTpnLnR5cGUsZGVmYXVsdFRhcmdldE9ubHk6Zy5kZWZhdWx0VGFyZ2V0T25seX0sZj1nLmdldFN1YnMoKSxsPWZbMF0sYz1mWzFdLGcuc3RvcHBlZD1nLnR5cGUhPT1uLnR5cGU/MDpuLnN0b3BwZWQsZy5wcmV2ZW50ZWQ9Zy50eXBlIT09bi50eXBlPzA6bi5wcmV2ZW50ZWQsZy5zdG9wcGVkRm4mJihhPW5ldyBlLkV2ZW50VGFyZ2V0KHtmaXJlT25jZTohMCxjb250ZXh0Onl9KSxnLmV2ZW50cz1hLGEub24oInN0b3BwZWQiLGcuc3RvcHBlZEZuKSksZy5fZmFjYWRlPW51bGwscj1nLl9jcmVhdGVGYWNhZGUodCksbCYmZy5fcHJvY1N1YnMobCx0LHIpLGcuYnViYmxlcyYmeS5idWJibGUmJiFnLnN0b3BwZWQmJih3PW4uYnViYmxpbmcsbi5idWJibGluZz1nLnR5cGUsbi50eXBlIT09Zy50eXBlJiYobi5zdG9wcGVkPTAsbi5wcmV2ZW50ZWQ9MCksdT15LmJ1YmJsZShnLHQsbnVsbCxuKSxnLnN0b3BwZWQ9TWF0aC5tYXgoZy5zdG9wcGVkLG4uc3RvcHBlZCksZy5wcmV2ZW50ZWQ9TWF0aC5tYXgoZy5wcmV2ZW50ZWQsbi5wcmV2ZW50ZWQpLG4uYnViYmxpbmc9dyksZD1nLnByZXZlbnRlZCxkPyh2PWcucHJldmVudGVkRm4sdiYmdi5hcHBseSh5LHQpKToobT1nLmRlZmF1bHRGbixtJiYoIWcuZGVmYXVsdFRhcmdldE9ubHkmJiFuLmRlZmF1bHRUYXJnZXRPbmx5fHx5PT09ci50YXJnZXQpJiZtLmFwcGx5KHksdCkpLGcuYnJvYWRjYXN0JiZnLl9icm9hZGNhc3QodCk7aWYoYyYmIWcucHJldmVudGVkJiZnLnN0b3BwZWQ8Mil7aD1uLmFmdGVyUXVldWU7aWYobi5pZD09PWcuaWR8fGcudHlwZSE9PVMuYnViYmxpbmcpe2cuX3Byb2NTdWJzKGMsdCxyKTtpZihoKXdoaWxlKGI9aC5sYXN0KCkpYigpfWVsc2UgcD1jLG4uZXhlY0RlZmF1bHRDbnQmJihwPWUubWVyZ2UocCksZS5lYWNoKHAsZnVuY3Rpb24oZSl7ZS5wb3N0cG9uZWQ9ITB9KSksaHx8KG4uYWZ0ZXJRdWV1ZT1uZXcgZS5RdWV1ZSksbi5hZnRlclF1ZXVlLmFkZChmdW5jdGlvbigpe2cuX3Byb2NTdWJzKHAsdCxyKX0pfWcudGFyZ2V0PW51bGw7aWYobi5pZD09PWcuaWQpe3M9bi5xdWV1ZTtpZihzKXdoaWxlKHMubGVuZ3RoKWk9cy5wb3AoKSxvPWlbMF0sbi5uZXh0PW8sby5fZmlyZShpWzFdKTtnLnN0YWNrPW51bGx9dT0hZy5zdG9wcGVkLGcudHlwZSE9PVMuYnViYmxpbmcmJihuLnN0b3BwZWQ9MCxuLnByZXZlbnRlZD0wLGcuc3RvcHBlZD0wLGcucHJldmVudGVkPTApfWVsc2UgbT1nLmRlZmF1bHRGbixtJiYocj1nLl9jcmVhdGVGYWNhZGUodCksKCFnLmRlZmF1bHRUYXJnZXRPbmx5fHx5PT09ci50YXJnZXQpJiZtLmFwcGx5KHksdCkpO3JldHVybiBnLl9mYWNhZGU9bnVsbCx1fSx1Ll9oYXNQb3RlbnRpYWxTdWJzY3JpYmVycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc1N1YnMoKXx8dGhpcy5ob3N0Ll95dWlldnQuaGFzVGFyZ2V0c3x8dGhpcy5icm9hZGNhc3R9LHUuX2NyZWF0ZUZhY2FkZT11Ll9nZXRGYWNhZGU9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5kZXRhaWxzLHI9biYmblswXSxpPXImJnR5cGVvZiByPT0ib2JqZWN0IixzPXRoaXMuX2ZhY2FkZTtyZXR1cm4gc3x8KHM9bmV3IGUuRXZlbnRGYWNhZGUodGhpcyx0aGlzLmN1cnJlbnRUYXJnZXQpKSxpPyhmKHMsciksci50eXBlJiYocy50eXBlPXIudHlwZSksdCYmKHRbMF09cykpOnQmJnQudW5zaGlmdChzKSxzLmRldGFpbHM9dGhpcy5kZXRhaWxzLHMudGFyZ2V0PXRoaXMub3JpZ2luYWxUYXJnZXR8fHRoaXMudGFyZ2V0LHMuY3VycmVudFRhcmdldD10aGlzLmN1cnJlbnRUYXJnZXQscy5zdG9wcGVkPTAscy5wcmV2ZW50ZWQ9MCx0aGlzLl9mYWNhZGU9cyx0aGlzLl9mYWNhZGV9LHUuX2FkZEZhY2FkZVRvQXJncz1mdW5jdGlvbihlKXt2YXIgdD1lWzBdO3QmJnQuaGFsdCYmdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJnQuc3RvcFByb3BhZ2F0aW9uJiZ0Ll9ldmVudHx8dGhpcy5fY3JlYXRlRmFjYWRlKGUpfSx1LnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe3RoaXMuc3RvcHBlZD0xLHRoaXMuc3RhY2smJih0aGlzLnN0YWNrLnN0b3BwZWQ9MSksdGhpcy5ldmVudHMmJnRoaXMuZXZlbnRzLmZpcmUoInN0b3BwZWQiLHRoaXMpfSx1LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbj1mdW5jdGlvbigpe3RoaXMuc3RvcHBlZD0yLHRoaXMuc3RhY2smJih0aGlzLnN0YWNrLnN0b3BwZWQ9MiksdGhpcy5ldmVudHMmJnRoaXMuZXZlbnRzLmZpcmUoInN0b3BwZWQiLHRoaXMpfSx1LnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dGhpcy5wcmV2ZW50YWJsZSYmKHRoaXMucHJldmVudGVkPTEsdGhpcy5zdGFjayYmKHRoaXMuc3RhY2sucHJldmVudGVkPTEpKX0sdS5oYWx0PWZ1bmN0aW9uKGUpe2U/dGhpcy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTp0aGlzLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMucHJldmVudERlZmF1bHQoKX0sYS5hZGRUYXJnZXQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5feXVpZXZ0O3JldHVybiBuLnRhcmdldHN8fChuLnRhcmdldHM9e30pLG4udGFyZ2V0c1tlLnN0YW1wKHQpXT10LG4uaGFzVGFyZ2V0cz0hMCx0aGlzfSxhLmdldFRhcmdldHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl95dWlldnQudGFyZ2V0cztyZXR1cm4gZT9pLnZhbHVlcyhlKTpbXX0sYS5yZW1vdmVUYXJnZXQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5feXVpZXZ0LnRhcmdldHM7cmV0dXJuIG4mJihkZWxldGUgbltlLnN0YW1wKHQsITApXSxpLnNpemUobik9PT0wJiYodGhpcy5feXVpZXZ0Lmhhc1RhcmdldHM9ITEpKSx0aGlzfSxhLmJ1YmJsZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLl95dWlldnQudGFyZ2V0cyxzPSEwLG8sdSxhLGYsbCxjPWUmJmUudHlwZSxoPW58fGUmJmUudGFyZ2V0fHx0aGlzLHA7aWYoIWV8fCFlLnN0b3BwZWQmJmkpZm9yKGEgaW4gaSlpZihpLmhhc093blByb3BlcnR5KGEpKXtvPWlbYV0sdT1vLl95dWlldnQuZXZlbnRzW2NdLG8uX2hhc1NpYmxpbmdzJiYobD1vLmdldFNpYmxpbmcoYyx1KSksbCYmIXUmJih1PW8ucHVibGlzaChjKSkscD1vLl95dWlldnQuYnViYmxpbmcsby5feXVpZXZ0LmJ1YmJsaW5nPWM7aWYoIXUpby5feXVpZXZ0Lmhhc1RhcmdldHMmJm8uYnViYmxlKGUsdCxoLHIpO2Vsc2V7bCYmKHUuc2libGluZz1sKSx1LnRhcmdldD1oLHUub3JpZ2luYWxUYXJnZXQ9aCx1LmN1cnJlbnRUYXJnZXQ9byxmPXUuYnJvYWRjYXN0LHUuYnJvYWRjYXN0PSExLHUuZW1pdEZhY2FkZT0hMCx1LnN0YWNrPXIscz1zJiZ1LmZpcmUuYXBwbHkodSx0fHxlLmRldGFpbHN8fFtdKSx1LmJyb2FkY2FzdD1mLHUub3JpZ2luYWxUYXJnZXQ9bnVsbDtpZih1LnN0b3BwZWQpYnJlYWt9by5feXVpZXZ0LmJ1YmJsaW5nPXB9cmV0dXJuIHN9LGEuX2hhc1BvdGVudGlhbFN1YnNjcmliZXJzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3l1aWV2dCxuPXQuZXZlbnRzW2VdO3JldHVybiBuP24uaGFzU3VicygpfHx0Lmhhc1RhcmdldHN8fG4uYnJvYWRjYXN0OiExfSxuPW5ldyBlLkV2ZW50RmFjYWRlLHI9e307Zm9yKHMgaW4gbilyW3NdPSEwfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJiYXNlLWNvcmUiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gdihlKXt0aGlzLl9CYXNlSW52b2tlZHx8KHRoaXMuX0Jhc2VJbnZva2VkPSEwLHRoaXMuX2luaXRCYXNlKGUpKX12YXIgbj1lLk9iamVjdCxyPWUuTGFuZyxpPSIuIixzPSJpbml0aWFsaXplZCIsbz0iZGVzdHJveWVkIix1PSJpbml0aWFsaXplciIsYT0idmFsdWUiLGY9T2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcixsPSJkZWVwIixjPSJzaGFsbG93IixoPSJkZXN0cnVjdG9yIixwPWUuQXR0cmlidXRlQ29yZSxkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtmb3IociBpbiB0KW5bcl0mJihlW3JdPXRbcl0pO3JldHVybiBlfTt2Ll9BVFRSX0NGRz1wLl9BVFRSX0NGRy5jb25jYXQoImNsb25lRGVmYXVsdFZhbHVlIiksdi5fTk9OX0FUVFJTX0NGRz1bInBsdWdpbnMiXSx2Lk5BTUU9ImJhc2VDb3JlIix2LkFUVFJTPXtpbml0aWFsaXplZDp7cmVhZE9ubHk6ITAsdmFsdWU6ITF9LGRlc3Ryb3llZDp7cmVhZE9ubHk6ITAsdmFsdWU6ITF9fSx2Lm1vZGlmeUF0dHJzPWZ1bmN0aW9uKHQsbil7dHlwZW9mIHQhPSJmdW5jdGlvbiImJihuPXQsdD10aGlzKTt2YXIgcixpLHM7cj10LkFUVFJTfHwodC5BVFRSUz17fSk7aWYobil7dC5fQ0FDSEVEX0NMQVNTX0RBVEE9bnVsbDtmb3IocyBpbiBuKW4uaGFzT3duUHJvcGVydHkocykmJihpPXJbc118fChyW3NdPXt9KSxlLm1peChpLG5bc10sITApKX19LHYucHJvdG90eXBlPXtfaW5pdEJhc2U6ZnVuY3Rpb24odCl7ZS5zdGFtcCh0aGlzKSx0aGlzLl9pbml0QXR0cmlidXRlKHQpO3ZhciBuPWUuUGx1Z2luJiZlLlBsdWdpbi5Ib3N0O3RoaXMuX2luaXRQbHVnaW5zJiZuJiZuLmNhbGwodGhpcyksdGhpcy5fbGF6eUFkZEF0dHJzIT09ITEmJih0aGlzLl9sYXp5QWRkQXR0cnM9ITApLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLk5BTUUsdGhpcy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX2luaXRBdHRyaWJ1dGU6ZnVuY3Rpb24oKXtwLmNhbGwodGhpcyl9LGluaXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2Jhc2VJbml0KGUpLHRoaXN9LF9iYXNlSW5pdDpmdW5jdGlvbihlKXt0aGlzLl9pbml0SGllcmFyY2h5KGUpLHRoaXMuX2luaXRQbHVnaW5zJiZ0aGlzLl9pbml0UGx1Z2lucyhlKSx0aGlzLl9zZXQocywhMCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZURlc3Ryb3koKSx0aGlzfSxfYmFzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9kZXN0cm95UGx1Z2lucyYmdGhpcy5fZGVzdHJveVBsdWdpbnMoKSx0aGlzLl9kZXN0cm95SGllcmFyY2h5KCksdGhpcy5fc2V0KG8sITApfSxfZ2V0Q2xhc3NlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jbGFzc2VzfHx0aGlzLl9pbml0SGllcmFyY2h5RGF0YSgpLHRoaXMuX2NsYXNzZXN9LF9nZXRBdHRyQ2ZnczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hdHRyc3x8dGhpcy5faW5pdEhpZXJhcmNoeURhdGEoKSx0aGlzLl9hdHRyc30sX2dldEluc3RhbmNlQXR0ckNmZ3M6ZnVuY3Rpb24oZSl7dmFyIHQ9e30scixpLHMsbyx1LGEsZixsPWUuX3N1YkF0dHJzLGM9dGhpcy5fYXR0ckNmZ0hhc2goKTtmb3IoYSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoYSkmJmEhPT0iX3N1YkF0dHJzIil7Zj1lW2FdLHI9dFthXT1kKHt9LGYsYyksaT1yLnZhbHVlLGkmJnR5cGVvZiBpPT0ib2JqZWN0IiYmdGhpcy5fY2xvbmVEZWZhdWx0VmFsdWUoYSxyKTtpZihsJiZsLmhhc093blByb3BlcnR5KGEpKXtvPWUuX3N1YkF0dHJzW2FdO2Zvcih1IGluIG8pcz1vW3VdLHMucGF0aCYmbi5zZXRWYWx1ZShyLnZhbHVlLHMucGF0aCxzLnZhbHVlKX19cmV0dXJuIHR9LF9maWx0ZXJBZEhvY0F0dHJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLl9ub25BdHRycyxpO2lmKHQpe249e307Zm9yKGkgaW4gdCkhZVtpXSYmIXJbaV0mJnQuaGFzT3duUHJvcGVydHkoaSkmJihuW2ldPXt2YWx1ZTp0W2ldfSl9cmV0dXJuIG59LF9pbml0SGllcmFyY2h5RGF0YTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuY29uc3RydWN0b3IsdD1lLl9DQUNIRURfQ0xBU1NfREFUQSxuLHIsaSxzLG8sdT0hZS5fQVRUUl9DRkdfSEFTSCxhLGY9e30sbD1bXSxjPVtdO249ZTtpZighdCl7d2hpbGUobil7bFtsLmxlbmd0aF09bixuLkFUVFJTJiYoY1tjLmxlbmd0aF09bi5BVFRSUyk7aWYodSl7cz1uLl9BVFRSX0NGRyxvPW98fHt9O2lmKHMpZm9yKHI9MCxpPXMubGVuZ3RoO3I8aTtyKz0xKW9bc1tyXV09ITB9YT1uLl9OT05fQVRUUlNfQ0ZHO2lmKGEpZm9yKHI9MCxpPWEubGVuZ3RoO3I8aTtyKyspZlthW3JdXT0hMDtuPW4uc3VwZXJjbGFzcz9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3I6bnVsbH11JiYoZS5fQVRUUl9DRkdfSEFTSD1vKSx0PWUuX0NBQ0hFRF9DTEFTU19EQVRBPXtjbGFzc2VzOmwsbm9uQXR0cnM6ZixhdHRyczp0aGlzLl9hZ2dyZWdhdGVBdHRycyhjKX19dGhpcy5fY2xhc3Nlcz10LmNsYXNzZXMsdGhpcy5fYXR0cnM9dC5hdHRycyx0aGlzLl9ub25BdHRycz10Lm5vbkF0dHJzfSxfYXR0ckNmZ0hhc2g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5fQVRUUl9DRkdfSEFTSH0sX2Nsb25lRGVmYXVsdFZhbHVlOmZ1bmN0aW9uKHQsbil7dmFyIGk9bi52YWx1ZSxzPW4uY2xvbmVEZWZhdWx0VmFsdWU7cz09PWx8fHM9PT0hMD9uLnZhbHVlPWUuY2xvbmUoaSk6cz09PWM/bi52YWx1ZT1lLm1lcmdlKGkpOnM9PT11bmRlZmluZWQmJihmPT09aS5jb25zdHJ1Y3Rvcnx8ci5pc0FycmF5KGkpKSYmKG4udmFsdWU9ZS5jbG9uZShpKSl9LF9hZ2dyZWdhdGVBdHRyczpmdW5jdGlvbihlKXt2YXIgdCxuLHIscyxvLHUsZj10aGlzLl9hdHRyQ2ZnSGFzaCgpLGwsYz17fTtpZihlKWZvcih1PWUubGVuZ3RoLTE7dT49MDstLXUpe249ZVt1XTtmb3IodCBpbiBuKW4uaGFzT3duUHJvcGVydHkodCkmJihzPWQoe30sblt0XSxmKSxvPW51bGwsdC5pbmRleE9mKGkpIT09LTEmJihvPXQuc3BsaXQoaSksdD1vLnNoaWZ0KCkpLGw9Y1t0XSxvJiZsJiZsLnZhbHVlPyhyPWMuX3N1YkF0dHJzLHJ8fChyPWMuX3N1YkF0dHJzPXt9KSxyW3RdfHwoclt0XT17fSksclt0XVtvLmpvaW4oaSldPXt2YWx1ZTpzLnZhbHVlLHBhdGg6b30pOm98fChsPyhsLnZhbHVlRm4mJmEgaW4gcyYmKGwudmFsdWVGbj1udWxsKSxkKGwscyxmKSk6Y1t0XT1zKSl9cmV0dXJuIGN9LF9pbml0SGllcmFyY2h5OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xhenlBZGRBdHRycyxuLHIsaSxzLG8sYSxmLGwsYyxoLHAsZD1bXSx2PXRoaXMuX2dldENsYXNzZXMoKSxtPXRoaXMuX2dldEF0dHJDZmdzKCksZz12Lmxlbmd0aC0xO2ZvcihvPWc7bz49MDtvLS0pe249dltvXSxyPW4ucHJvdG90eXBlLGg9bi5feXVpYnVpbGQmJm4uX3l1aWJ1aWxkLmV4dHMsci5oYXNPd25Qcm9wZXJ0eSh1KSYmKGRbZC5sZW5ndGhdPXIuaW5pdGlhbGl6ZXIpO2lmKGgpZm9yKGE9MCxmPWgubGVuZ3RoO2E8ZjthKyspbD1oW2FdLGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLGM9bC5wcm90b3R5cGUsYy5oYXNPd25Qcm9wZXJ0eSh1KSYmKGRbZC5sZW5ndGhdPWMuaW5pdGlhbGl6ZXIpfXA9dGhpcy5fZ2V0SW5zdGFuY2VBdHRyQ2ZncyhtKSx0aGlzLl9wcmVBZGRBdHRycyYmdGhpcy5fcHJlQWRkQXR0cnMocCxlLHQpLHRoaXMuX2FsbG93QWRIb2NBdHRycyYmdGhpcy5hZGRBdHRycyh0aGlzLl9maWx0ZXJBZEhvY0F0dHJzKG0sZSksZSx0KSx0aGlzLmFkZEF0dHJzKHAsZSx0KTtmb3IoaT0wLHM9ZC5sZW5ndGg7aTxzO2krKylkW2ldLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX2Rlc3Ryb3lIaWVyYXJjaHk6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLHMsbyx1LGE9dGhpcy5fZ2V0Q2xhc3NlcygpO2ZvcihuPTAscj1hLmxlbmd0aDtuPHI7bisrKXtlPWFbbl0sdD1lLnByb3RvdHlwZSxvPWUuX3l1aWJ1aWxkJiZlLl95dWlidWlsZC5leHRzO2lmKG8pZm9yKGk9MCxzPW8ubGVuZ3RoO2k8cztpKyspdT1vW2ldLnByb3RvdHlwZSx1Lmhhc093blByb3BlcnR5KGgpJiZ1LmRlc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpO3QuaGFzT3duUHJvcGVydHkoaCkmJnQuZGVzdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIlsiK2Uuc3RhbXAodGhpcywhMCkrIl0ifX0sZS5taXgodixwLCExLG51bGwsMSksdi5wcm90b3R5cGUuY29uc3RydWN0b3I9dixlLkJhc2VDb3JlPXZ9LCIzLjE3LjIiLHtyZXF1aXJlczpbImF0dHJpYnV0ZS1jb3JlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImF0dHJpYnV0ZS1iYXNlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtlLkF0dHJpYnV0ZUNvcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUuQXR0cmlidXRlT2JzZXJ2YWJsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS5BdHRyaWJ1dGVFeHRyYXMuYXBwbHkodGhpcyxhcmd1bWVudHMpfWUubWl4KG4sZS5BdHRyaWJ1dGVDb3JlLCExLG51bGwsMSksZS5taXgobixlLkF0dHJpYnV0ZUV4dHJhcywhMSxudWxsLDEpLGUubWl4KG4sZS5BdHRyaWJ1dGVPYnNlcnZhYmxlLCEwLG51bGwsMSksbi5JTlZBTElEX1ZBTFVFPWUuQXR0cmlidXRlQ29yZS5JTlZBTElEX1ZBTFVFLG4uX0FUVFJfQ0ZHPWUuQXR0cmlidXRlQ29yZS5fQVRUUl9DRkcuY29uY2F0KGUuQXR0cmlidXRlT2JzZXJ2YWJsZS5fQVRUUl9DRkcpLG4ucHJvdGVjdEF0dHJzPWUuQXR0cmlidXRlQ29yZS5wcm90ZWN0QXR0cnMsZS5BdHRyaWJ1dGU9bn0sIjMuMTcuMiIse3JlcXVpcmVzOlsiYXR0cmlidXRlLWNvcmUiLCJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImF0dHJpYnV0ZS1leHRyYXMiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiYXR0cmlidXRlLWV4dHJhcyIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBvKCl7fXZhciBuPSJicm9hZGNhc3QiLHI9InB1Ymxpc2hlZCIsaT0iaW5pdFZhbHVlIixzPXtyZWFkT25seToxLHdyaXRlT25jZToxLGdldHRlcjoxLGJyb2FkY2FzdDoxfTtvLnByb3RvdHlwZT17bW9kaWZ5QXR0cjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMsbyx1O2lmKGkuYXR0ckFkZGVkKGUpKXtpLl9pc0xhenlBdHRyKGUpJiZpLl9hZGRMYXp5QXR0cihlKSx1PWkuX3N0YXRlO2ZvcihvIGluIHQpc1tvXSYmdC5oYXNPd25Qcm9wZXJ0eShvKSYmKHUuYWRkKGUsbyx0W29dKSxvPT09biYmdS5yZW1vdmUoZSxyKSl9fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3RoaXMuX3N0YXRlLnJlbW92ZUFsbChlKX0scmVzZXQ6ZnVuY3Rpb24odCl7dmFyIG49dGhpcztyZXR1cm4gdD8obi5faXNMYXp5QXR0cih0KSYmbi5fYWRkTGF6eUF0dHIodCksbi5zZXQodCxuLl9zdGF0ZS5nZXQodCxpKSkpOmUuT2JqZWN0LmVhY2gobi5fc3RhdGUuZGF0YSxmdW5jdGlvbihlLHQpe24ucmVzZXQodCl9KSxufSxfZ2V0QXR0ckNmZzpmdW5jdGlvbih0KXt2YXIgbixyPXRoaXMuX3N0YXRlO3JldHVybiB0P249ci5nZXRBbGwodCl8fHt9OihuPXt9LGUuZWFjaChyLmRhdGEsZnVuY3Rpb24oZSx0KXtuW3RdPXIuZ2V0QWxsKHQpfSkpLG59fSxlLkF0dHJpYnV0ZUV4dHJhcz1vfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJvb3AiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiYXR0cmlidXRlLW9ic2VydmFibGUiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gcygpe3RoaXMuX0FUVFJfRV9GQUNBREU9e30sbi5jYWxsKHRoaXMse2VtaXRGYWNhZGU6ITB9KX12YXIgbj1lLkV2ZW50VGFyZ2V0LHI9IkNoYW5nZSIsaT0iYnJvYWRjYXN0IjtzLl9BVFRSX0NGRz1baV0scy5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuX3NldEF0dHIoZSx0LG4pfSxfc2V0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fc2V0QXR0cihlLHQsbiwhMCl9LHNldEF0dHJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3NldEF0dHJzKGUsdCl9LF9zZXRBdHRyczpmdW5jdGlvbihlLHQpe3ZhciBuO2ZvcihuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmdGhpcy5zZXQobixlW25dLHQpO3JldHVybiB0aGlzfSxfZmlyZUF0dHJDaGFuZ2U6ZnVuY3Rpb24odCxuLGkscyxvLHUpe3ZhciBhPXRoaXMsZj10aGlzLl9nZXRGdWxsVHlwZSh0K3IpLGw9YS5fc3RhdGUsYyxoLHA7dXx8KHU9bC5kYXRhW3RdfHx7fSksdS5wdWJsaXNoZWR8fChwPWEuX3B1Ymxpc2goZikscC5lbWl0RmFjYWRlPSEwLHAuZGVmYXVsdFRhcmdldE9ubHk9ITAscC5kZWZhdWx0Rm49YS5fZGVmQXR0ckNoYW5nZUZuLGg9dS5icm9hZGNhc3QsaCE9PXVuZGVmaW5lZCYmKHAuYnJvYWRjYXN0PWgpLHUucHVibGlzaGVkPSEwKSxvPyhjPWUubWVyZ2UobyksYy5fYXR0ck9wdHM9byk6Yz1hLl9BVFRSX0VfRkFDQURFLGMuYXR0ck5hbWU9dCxjLnN1YkF0dHJOYW1lPW4sYy5wcmV2VmFsPWksYy5uZXdWYWw9cyxhLl9oYXNQb3RlbnRpYWxTdWJzY3JpYmVycyhmKT9hLmZpcmUoZixjKTp0aGlzLl9zZXRBdHRyVmFsKHQsbixpLHMsbyx1KX0sX2RlZkF0dHJDaGFuZ2VGbjpmdW5jdGlvbihlLHQpe3ZhciBuPWUuX2F0dHJPcHRzO24mJmRlbGV0ZSBlLl9hdHRyT3B0cyx0aGlzLl9zZXRBdHRyVmFsKGUuYXR0ck5hbWUsZS5zdWJBdHRyTmFtZSxlLnByZXZWYWwsZS5uZXdWYWwsbik/dHx8KGUubmV3VmFsPXRoaXMuZ2V0KGUuYXR0ck5hbWUpKTp0fHxlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfX0sZS5taXgocyxuLCExLG51bGwsMSksZS5BdHRyaWJ1dGVPYnNlcnZhYmxlPXMsZS5BdHRyaWJ1dGVFdmVudHM9c30sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtY3VzdG9tIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImJhc2Utb2JzZXJ2YWJsZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBmKCl7fXZhciBuPWUuTGFuZyxyPSJkZXN0cm95IixpPSJpbml0IixzPSJidWJibGVUYXJnZXRzIixvPSJfYnViYmxlVGFyZ2V0cyIsdT1lLkF0dHJpYnV0ZU9ic2VydmFibGUsYT1lLkJhc2VDb3JlO2YuX0FUVFJfQ0ZHPXUuX0FUVFJfQ0ZHLmNvbmNhdCgpLGYuX05PTl9BVFRSU19DRkc9WyJvbiIsImFmdGVyIiwiYnViYmxlVGFyZ2V0cyJdLGYucHJvdG90eXBlPXtfaW5pdEF0dHJpYnV0ZTpmdW5jdGlvbigpe2EucHJvdG90eXBlLl9pbml0QXR0cmlidXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx1LmNhbGwodGhpcyksdGhpcy5fZXZlbnRQcmVmaXg9dGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9QUkVGSVh8fHRoaXMuY29uc3RydWN0b3IuTkFNRSx0aGlzLl95dWlldnQuY29uZmlnLnByZWZpeD10aGlzLl9ldmVudFByZWZpeH0saW5pdDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRGdWxsVHlwZShpKSxuPXRoaXMuX3B1Ymxpc2godCk7cmV0dXJuIG4uZW1pdEZhY2FkZT0hMCxuLmZpcmVPbmNlPSEwLG4uZGVmYXVsdFRhcmdldE9ubHk9ITAsbi5kZWZhdWx0Rm49dGhpcy5fZGVmSW5pdEZuLHRoaXMuX3ByZUluaXRFdmVudENmZyhlKSxuLl9oYXNQb3RlbnRpYWxTdWJzY3JpYmVycygpP3RoaXMuZmlyZSh0LHtjZmc6ZX0pOih0aGlzLl9iYXNlSW5pdChlKSxuLmZpcmVkPSEwLG4uZmlyZWRXaXRoPVt7Y2ZnOmV9XSksdGhpc30sX3ByZUluaXRFdmVudENmZzpmdW5jdGlvbihlKXtlJiYoZS5vbiYmdGhpcy5vbihlLm9uKSxlLmFmdGVyJiZ0aGlzLmFmdGVyKGUuYWZ0ZXIpKTt2YXIgdCxyLGksdT1lJiZzIGluIGU7aWYodXx8byBpbiB0aGlzKXtpPXU/ZSYmZS5idWJibGVUYXJnZXRzOnRoaXMuX2J1YmJsZVRhcmdldHM7aWYobi5pc0FycmF5KGkpKWZvcih0PTAscj1pLmxlbmd0aDt0PHI7dCsrKXRoaXMuYWRkVGFyZ2V0KGlbdF0pO2Vsc2UgaSYmdGhpcy5hZGRUYXJnZXQoaSl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVibGlzaChyLHtmaXJlT25jZTohMCxkZWZhdWx0VGFyZ2V0T25seTohMCxkZWZhdWx0Rm46dGhpcy5fZGVmRGVzdHJveUZufSksdGhpcy5maXJlKHIpLHRoaXMuZGV0YWNoQWxsKCksdGhpc30sX2RlZkluaXRGbjpmdW5jdGlvbihlKXt0aGlzLl9iYXNlSW5pdChlLmNmZyl9LF9kZWZEZXN0cm95Rm46ZnVuY3Rpb24oZSl7dGhpcy5fYmFzZURlc3Ryb3koZS5jZmcpfX0sZS5taXgoZix1LCExLG51bGwsMSksZS5CYXNlT2JzZXJ2YWJsZT1mfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImJhc2UtY29yZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJiYXNlLWJhc2UiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbygpe2kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBuPWUuQXR0cmlidXRlQ29yZSxyPWUuQXR0cmlidXRlRXh0cmFzLGk9ZS5CYXNlQ29yZSxzPWUuQmFzZU9ic2VydmFibGU7by5fQVRUUl9DRkc9aS5fQVRUUl9DRkcuY29uY2F0KHMuX0FUVFJfQ0ZHKSxvLl9OT05fQVRUUlNfQ0ZHPWkuX05PTl9BVFRSU19DRkcuY29uY2F0KHMuX05PTl9BVFRSU19DRkcpLG8uTkFNRT0iYmFzZSIsby5BVFRSUz1uLnByb3RlY3RBdHRycyhpLkFUVFJTKSxvLm1vZGlmeUF0dHJzPWkubW9kaWZ5QXR0cnMsZS5taXgobyxpLCExLG51bGwsMSksZS5taXgobyxyLCExLG51bGwsMSksZS5taXgobyxzLCEwLG51bGwsMSksby5wcm90b3R5cGUuY29uc3RydWN0b3I9byxlLkJhc2U9b30sIjMuMTcuMiIse3JlcXVpcmVzOlsiYXR0cmlidXRlLWJhc2UiLCJiYXNlLWNvcmUiLCJiYXNlLW9ic2VydmFibGUiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiYmFzZS1wbHVnaW5ob3N0IixmdW5jdGlvbihlLHQpe3ZhciBuPWUuQmFzZSxyPWUuUGx1Z2luLkhvc3Q7ZS5taXgobixyLCExLG51bGwsMSksbi5wbHVnPXIucGx1ZyxuLnVucGx1Zz1yLnVucGx1Z30sIjMuMTcuMiIse3JlcXVpcmVzOlsiYmFzZS1iYXNlIiwicGx1Z2luaG9zdCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJiYXNlLWJ1aWxkIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGYoZSx0LG4pe25bZV0mJih0W2VdPSh0W2VdfHxbXSkuY29uY2F0KG5bZV0pKX1mdW5jdGlvbiBsKGUsdCxuKXtuLl9BVFRSX0NGRyYmKHQuX0FUVFJfQ0ZHX0hBU0g9bnVsbCxmLmFwcGx5KG51bGwsYXJndW1lbnRzKSl9ZnVuY3Rpb24gYyhlLHQscil7bi5tb2RpZnlBdHRycyh0LHIuQVRUUlMpfXZhciBuPWUuQmFzZUNvcmUscj1lLkJhc2UsaT1lLkxhbmcscz0iaW5pdGlhbGl6ZXIiLG89ImRlc3RydWN0b3IiLHU9WyJfUExVRyIsIl9VTlBMVUciXSxhO3IuX2J1aWxkPWZ1bmN0aW9uKHQsbixpLHUsYSxmKXt2YXIgbD1yLl9idWlsZCxjPWwuX2N0b3IobixmKSxoPWwuX2NmZyhuLGYsaSkscD1sLl9taXhDdXN0LGQ9Yy5feXVpYnVpbGQuZHluYW1pYyx2LG0sZyx5LGIsdztmb3Iodj0wLG09aS5sZW5ndGg7djxtO3YrKylnPWlbdl0seT1nLnByb3RvdHlwZSxiPXlbc10sdz15W29dLGRlbGV0ZSB5W3NdLGRlbGV0ZSB5W29dLGUubWl4KGMsZywhMCxudWxsLDEpLHAoYyxnLGgpLGImJih5W3NdPWIpLHcmJih5W29dPXcpLGMuX3l1aWJ1aWxkLmV4dHMucHVzaChnKTtyZXR1cm4gdSYmZS5taXgoYy5wcm90b3R5cGUsdSwhMCksYSYmKGUubWl4KGMsbC5fY2xlYW4oYSxoKSwhMCkscChjLGEsaCkpLGMucHJvdG90eXBlLmhhc0ltcGw9bC5faW1wbCxkJiYoYy5OQU1FPXQsYy5wcm90b3R5cGUuY29uc3RydWN0b3I9YyxjLm1vZGlmeUF0dHJzPW4ubW9kaWZ5QXR0cnMpLGN9LGE9ci5fYnVpbGQsZS5taXgoYSx7X21peEN1c3Q6ZnVuY3Rpb24odCxuLHIpe3ZhciBzLG8sdSxhLGYsbDtyJiYocz1yLmFnZ3JlZ2F0ZXMsbz1yLmN1c3RvbSx1PXIuc3RhdGljcyksdSYmZS5taXgodCxuLCEwLHUpO2lmKHMpZm9yKGw9MCxmPXMubGVuZ3RoO2w8ZjtsKyspYT1zW2xdLCF0Lmhhc093blByb3BlcnR5KGEpJiZuLmhhc093blByb3BlcnR5KGEpJiYodFthXT1pLmlzQXJyYXkoblthXSk/W106e30pLGUuYWdncmVnYXRlKHQsbiwhMCxbYV0pO2lmKG8pZm9yKGwgaW4gbylvLmhhc093blByb3BlcnR5KGwpJiZvW2xdKGwsdCxuKX0sX3RtcGw6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbigpe24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGUuZXh0ZW5kKG4sdCksbn0sX2ltcGw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0Q2xhc3NlcygpLG4scixpLHMsbyx1O2ZvcihuPTAscj10Lmxlbmd0aDtuPHI7bisrKXtpPXRbbl07aWYoaS5feXVpYnVpbGQpe3M9aS5feXVpYnVpbGQuZXh0cyxvPXMubGVuZ3RoO2Zvcih1PTA7dTxvO3UrKylpZihzW3VdPT09ZSlyZXR1cm4hMH19cmV0dXJuITF9LF9jdG9yOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCYmITE9PT10LmR5bmFtaWM/ITE6ITAscj1uP2EuX3RtcGwoZSk6ZSxpPXIuX3l1aWJ1aWxkO3JldHVybiBpfHwoaT1yLl95dWlidWlsZD17fSksaS5pZD1pLmlkfHxudWxsLGkuZXh0cz1pLmV4dHN8fFtdLGkuZHluYW1pYz1uLHJ9LF9jZmc6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPVtdLHM9e30sbz1bXSx1LGE9biYmbi5hZ2dyZWdhdGVzLGY9biYmbi5jdXN0b20sbD1uJiZuLnN0YXRpY3MsYz10LGgscDt3aGlsZShjJiZjLnByb3RvdHlwZSl1PWMuX2J1aWxkQ2ZnLHUmJih1LmFnZ3JlZ2F0ZXMmJihpPWkuY29uY2F0KHUuYWdncmVnYXRlcykpLHUuY3VzdG9tJiZlLm1peChzLHUuY3VzdG9tLCEwKSx1LnN0YXRpY3MmJihvPW8uY29uY2F0KHUuc3RhdGljcykpKSxjPWMuc3VwZXJjbGFzcz9jLnN1cGVyY2xhc3MuY29uc3RydWN0b3I6bnVsbDtpZihyKWZvcihoPTAscD1yLmxlbmd0aDtoPHA7aCsrKWM9cltoXSx1PWMuX2J1aWxkQ2ZnLHUmJih1LmFnZ3JlZ2F0ZXMmJihpPWkuY29uY2F0KHUuYWdncmVnYXRlcykpLHUuY3VzdG9tJiZlLm1peChzLHUuY3VzdG9tLCEwKSx1LnN0YXRpY3MmJihvPW8uY29uY2F0KHUuc3RhdGljcykpKTtyZXR1cm4gYSYmKGk9aS5jb25jYXQoYSkpLGYmJmUubWl4KHMsbi5jZmdCdWlsZCwhMCksbCYmKG89by5jb25jYXQobCkpLHthZ2dyZWdhdGVzOmksY3VzdG9tOnMsc3RhdGljczpvfX0sX2NsZWFuOmZ1bmN0aW9uKHQsbil7dmFyIHIsaSxzLG89ZS5tZXJnZSh0KSx1PW4uYWdncmVnYXRlcyxhPW4uY3VzdG9tO2ZvcihyIGluIGEpby5oYXNPd25Qcm9wZXJ0eShyKSYmZGVsZXRlIG9bcl07Zm9yKGk9MCxzPXUubGVuZ3RoO2k8cztpKyspcj11W2ldLG8uaGFzT3duUHJvcGVydHkocikmJmRlbGV0ZSBvW3JdO3JldHVybiBvfX0pLHIuYnVpbGQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGEoZSx0LG4sbnVsbCxudWxsLHIpfSxyLmNyZWF0ZT1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBhKGUsdCxuLHIsaSl9LHIubWl4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX0NBQ0hFRF9DTEFTU19EQVRBJiYoZS5fQ0FDSEVEX0NMQVNTX0RBVEE9bnVsbCksYShudWxsLGUsdCxudWxsLG51bGwse2R5bmFtaWM6ITF9KX0sbi5fYnVpbGRDZmc9e2FnZ3JlZ2F0ZXM6dS5jb25jYXQoKSxjdXN0b206e0FUVFJTOmMsX0FUVFJfQ0ZHOmwsX05PTl9BVFRSU19DRkc6Zn19LHIuX2J1aWxkQ2ZnPXthZ2dyZWdhdGVzOnUuY29uY2F0KCksY3VzdG9tOntBVFRSUzpjLF9BVFRSX0NGRzpsLF9OT05fQVRUUlNfQ0ZHOmZ9fX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiYmFzZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LXN5bnRoZXRpYyIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBjKGUsdCl7dGhpcy5oYW5kbGU9ZSx0aGlzLmVtaXRGYWNhZGU9dH1mdW5jdGlvbiBoKGUsdCxuKXt0aGlzLmhhbmRsZXM9W10sdGhpcy5lbD1lLHRoaXMua2V5PW4sdGhpcy5kb21rZXk9dH1mdW5jdGlvbiBwKCl7dGhpcy5faW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIG49ZS5DdXN0b21FdmVudCxyPWUuRW52LmV2dC5kb21fbWFwLGk9ZS5BcnJheSxzPWUuTGFuZyxvPXMuaXNPYmplY3QsdT1zLmlzU3RyaW5nLGE9cy5pc0FycmF5LGY9ZS5TZWxlY3Rvci5xdWVyeSxsPWZ1bmN0aW9uKCl7fTtjLnByb3RvdHlwZS5maXJlPWZ1bmN0aW9uKHQpe3ZhciBuPWkoYXJndW1lbnRzLDAsITApLHI9dGhpcy5oYW5kbGUscz1yLmV2dCx1PXIuc3ViLGE9dS5jb250ZXh0LGY9dS5maWx0ZXIsbD10fHx7fSxjO2lmKHRoaXMuZW1pdEZhY2FkZSl7aWYoIXR8fCF0LnByZXZlbnREZWZhdWx0KWw9cy5fZ2V0RmFjYWRlKCksbyh0KSYmIXQucHJldmVudERlZmF1bHQ/KGUubWl4KGwsdCwhMCksblswXT1sKTpuLnVuc2hpZnQobCk7bC50eXBlPXMudHlwZSxsLmRldGFpbHM9bi5zbGljZSgpLGYmJihsLmNvbnRhaW5lcj1zLmhvc3QpfWVsc2UgZiYmbyh0KSYmdC5jdXJyZW50VGFyZ2V0JiZuLnNoaWZ0KCk7cmV0dXJuIHUuY29udGV4dD1hfHxsLmN1cnJlbnRUYXJnZXR8fHMuaG9zdCxjPXMuZmlyZS5hcHBseShzLG4pLHQucHJldmVudGVkJiZzLnByZXZlbnRlZEZuJiZzLnByZXZlbnRlZEZuLmFwcGx5KHMsbiksdC5zdG9wcGVkJiZzLnN0b3BwZWRGbiYmcy5zdG9wcGVkRm4uYXBwbHkocyxuKSx1LmNvbnRleHQ9YSxjfSxoLnByb3RvdHlwZT17Y29uc3RydWN0b3I6aCx0eXBlOiJfc3ludGgiLGZuOmwsY2FwdHVyZTohMSxyZWdpc3RlcjpmdW5jdGlvbihlKXtlLmV2dC5yZWdpc3RyeT10aGlzLHRoaXMuaGFuZGxlcy5wdXNoKGUpfSx1bnJlZ2lzdGVyOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuaGFuZGxlcyxpPXJbdGhpcy5kb21rZXldLHM7Zm9yKHM9bi5sZW5ndGgtMTtzPj0wOy0tcylpZihuW3NdLnN1Yj09PXQpe24uc3BsaWNlKHMsMSk7YnJlYWt9bi5sZW5ndGh8fChkZWxldGUgaVt0aGlzLmtleV0sZS5PYmplY3Quc2l6ZShpKXx8ZGVsZXRlIHJbdGhpcy5kb21rZXldKX0sZGV0YWNoQWxsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oYW5kbGVzLHQ9ZS5sZW5ndGg7d2hpbGUoLS10Pj0wKWVbdF0uZGV0YWNoKCl9fSxlLm1peChwLHtOb3RpZmllcjpjLFN5bnRoUmVnaXN0cnk6aCxnZXRSZWdpc3RyeTpmdW5jdGlvbih0LG4saSl7dmFyIHM9dC5fbm9kZSxvPWUuc3RhbXAocyksdT0iZXZlbnQ6IitvK24rIl9zeW50aCIsYT1yW29dO3JldHVybiBpJiYoYXx8KGE9cltvXT17fSksYVt1XXx8KGFbdV09bmV3IGgocyxvLHUpKSksYSYmYVt1XXx8bnVsbH0sX2RlbGV0ZVN1YjpmdW5jdGlvbihlKXtpZihlJiZlLmZuKXt2YXIgdD10aGlzLmV2ZW50RGVmLHI9ZS5maWx0ZXI/ImRldGFjaERlbGVnYXRlIjoiZGV0YWNoIjt0aGlzLl9zdWJzY3JpYmVycz1bXSxuLmtlZXBEZXByZWNhdGVkU3VicyYmKHRoaXMuc3Vic2NyaWJlcnM9e30pLHRbcl0oZS5ub2RlLGUsdGhpcy5ub3RpZmllcixlLmZpbHRlciksdGhpcy5yZWdpc3RyeS51bnJlZ2lzdGVyKGUpLGRlbGV0ZSBlLmZuLGRlbGV0ZSBlLm5vZGUsZGVsZXRlIGUuY29udGV4dH19LHByb3RvdHlwZTp7Y29uc3RydWN0b3I6cCxfaW5pdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHVibGlzaENvbmZpZ3x8KHRoaXMucHVibGlzaENvbmZpZz17fSk7dGhpcy5lbWl0RmFjYWRlPSJlbWl0RmFjYWRlImluIGU/ZS5lbWl0RmFjYWRlOiEwLGUuZW1pdEZhY2FkZT0hMX0scHJvY2Vzc0FyZ3M6bCxvbjpsLGRldGFjaDpsLGRlbGVnYXRlOmwsZGV0YWNoRGVsZWdhdGU6bCxfb246ZnVuY3Rpb24odCxuKXt2YXIgcj1bXSxzPXQuc2xpY2UoKSxvPXRoaXMucHJvY2Vzc0FyZ3ModCxuKSxhPXRbMl0sbD1uPyJkZWxlZ2F0ZSI6Im9uIixjLGg7cmV0dXJuIGM9dShhKT9mKGEpOmkoYXx8ZS5vbmUoZS5jb25maWcud2luKSksIWMubGVuZ3RoJiZ1KGEpPyhoPWUub24oImF2YWlsYWJsZSIsZnVuY3Rpb24oKXtlLm1peChoLGVbbF0uYXBwbHkoZSxzKSwhMCl9LGEpLGgpOihlLkFycmF5LmVhY2goYyxmdW5jdGlvbihpKXt2YXIgcz10LnNsaWNlKCksdTtpPWUub25lKGkpLGkmJihuJiYodT1zLnNwbGljZSgzLDEpWzBdKSxzLnNwbGljZSgwLDQsc1sxXSxzWzNdKSwoIXRoaXMucHJldmVudER1cHN8fCF0aGlzLmdldFN1YnMoaSx0LG51bGwsITApKSYmci5wdXNoKHRoaXMuX3N1YnNjcmliZShpLGwscyxvLHUpKSl9LHRoaXMpLHIubGVuZ3RoPT09MT9yWzBdOm5ldyBlLkV2ZW50SGFuZGxlKHIpKX0sX3N1YnNjcmliZTpmdW5jdGlvbih0LG4scixpLHMpe3ZhciBvPW5ldyBlLkN1c3RvbUV2ZW50KHRoaXMudHlwZSx0aGlzLnB1Ymxpc2hDb25maWcpLHU9by5vbi5hcHBseShvLHIpLGE9bmV3IGModSx0aGlzLmVtaXRGYWNhZGUpLGY9cC5nZXRSZWdpc3RyeSh0LHRoaXMudHlwZSwhMCksbD11LnN1YjtyZXR1cm4gbC5ub2RlPXQsbC5maWx0ZXI9cyxpJiZ0aGlzLmFwcGx5QXJnRXh0cmFzKGksbCksZS5taXgobyx7ZXZlbnREZWY6dGhpcyxub3RpZmllcjphLGhvc3Q6dCxjdXJyZW50VGFyZ2V0OnQsdGFyZ2V0OnQsZWw6dC5fbm9kZSxfZGVsZXRlOnAuX2RlbGV0ZVN1Yn0sITApLHUubm90aWZpZXI9YSxmLnJlZ2lzdGVyKHUpLHRoaXNbbl0odCxsLGEscyksdX0sYXBwbHlBcmdFeHRyYXM6ZnVuY3Rpb24oZSx0KXt0Ll9leHRyYT1lfSxfZGV0YWNoOmZ1bmN0aW9uKHQpe3ZhciBuPXRbMl0scj11KG4pP2Yobik6aShuKSxzLG8sYSxsLGM7dC5zcGxpY2UoMiwxKTtmb3Iobz0wLGE9ci5sZW5ndGg7bzxhOysrbyl7cz1lLm9uZShyW29dKTtpZihzKXtsPXRoaXMuZ2V0U3VicyhzLHQpO2lmKGwpZm9yKGM9bC5sZW5ndGgtMTtjPj0wOy0tYylsW2NdLmRldGFjaCgpfX19LGdldFN1YnM6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9cC5nZXRSZWdpc3RyeShlLHRoaXMudHlwZSkscz1bXSxvLHUsYSxmO2lmKGkpe289aS5oYW5kbGVzLG58fChuPXRoaXMuc3ViTWF0Y2gpO2Zvcih1PTAsYT1vLmxlbmd0aDt1PGE7Kyt1KXtmPW9bdV07aWYobi5jYWxsKHRoaXMsZi5zdWIsdCkpe2lmKHIpcmV0dXJuIGY7cy5wdXNoKG9bdV0pfX19cmV0dXJuIHMubGVuZ3RoJiZzfSxzdWJNYXRjaDpmdW5jdGlvbihlLHQpe3JldHVybiF0WzFdfHxlLmZuPT09dFsxXX19fSwhMCksZS5TeW50aGV0aWNFdmVudD1wLGUuRXZlbnQuZGVmaW5lPWZ1bmN0aW9uKHQsbixyKXt2YXIgcyxvLGY7dCYmdC50eXBlPyhzPXQscj1uKTpuJiYocz1lLm1lcmdlKHt0eXBlOnR9LG4pKTtpZihzKXtpZihyfHwhZS5Ob2RlLkRPTV9FVkVOVFNbcy50eXBlXSlvPWZ1bmN0aW9uKCl7cC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZXh0ZW5kKG8scCxzKSxmPW5ldyBvLHQ9Zi50eXBlLGUuTm9kZS5ET01fRVZFTlRTW3RdPWUuRW52LmV2dC5wbHVnaW5zW3RdPXtldmVudERlZjpmLG9uOmZ1bmN0aW9uKCl7cmV0dXJuIGYuX29uKGkoYXJndW1lbnRzKSl9LGRlbGVnYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuX29uKGkoYXJndW1lbnRzKSwhMCl9LGRldGFjaDpmdW5jdGlvbigpe3JldHVybiBmLl9kZXRhY2goaShhcmd1bWVudHMpKX19fWVsc2UodSh0KXx8YSh0KSkmJmUuQXJyYXkuZWFjaChpKHQpLGZ1bmN0aW9uKHQpe2UuTm9kZS5ET01fRVZFTlRTW3RdPTF9KTtyZXR1cm4gZn19LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWN1c3RvbS1jb21wbGV4Il19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImF0dHJpYnV0ZS1jb21wbGV4IixmdW5jdGlvbihlLHQpe3ZhciBuPWUuQXR0cmlidXRlO24uQ29tcGxleD1mdW5jdGlvbigpe30sbi5Db21wbGV4LnByb3RvdHlwZT17X25vcm1BdHRyVmFsczpuLnByb3RvdHlwZS5fbm9ybUF0dHJWYWxzLF9nZXRBdHRySW5pdFZhbDpuLnByb3RvdHlwZS5fZ2V0QXR0ckluaXRWYWx9LGUuQXR0cmlidXRlQ29tcGxleD1uLkNvbXBsZXh9LCIzLjE3LjIiLHtyZXF1aXJlczpbImF0dHJpYnV0ZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LW1vdXNlZW50ZXIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5FbnYuZXZ0LmRvbV93cmFwcGVycyxyPWUuRE9NLmNvbnRhaW5zLGk9ZS5BcnJheSxzPWZ1bmN0aW9uKCl7fSxvPXtwcm94eVR5cGU6Im1vdXNlb3ZlciIscmVsUHJvcGVydHk6ImZyb21FbGVtZW50Iixfbm90aWZ5OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbz10aGlzLl9ub2RlLHU9dC5yZWxhdGVkVGFyZ2V0fHx0W2ldO28hPT11JiYhcihvLHUpJiZzLmZpcmUobmV3IGUuRE9NRXZlbnRGYWNhZGUodCxvLG5bImV2ZW50OiIrZS5zdGFtcChvKSt0LnR5cGVdKSl9LG9uOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLk5vZGUuZ2V0RE9NTm9kZSh0KSxzPVt0aGlzLnByb3h5VHlwZSx0aGlzLl9ub3RpZnksaSxudWxsLHRoaXMucmVsUHJvcGVydHkscl07bi5oYW5kbGU9ZS5FdmVudC5fYXR0YWNoKHMse2ZhY2FkZTohMX0pfSxkZXRhY2g6ZnVuY3Rpb24oZSx0KXt0LmhhbmRsZS5kZXRhY2goKX0sZGVsZWdhdGU6ZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89ZS5Ob2RlLmdldERPTU5vZGUodCksdT1bdGhpcy5wcm94eVR5cGUscyxvLG51bGwscl07bi5oYW5kbGU9ZS5FdmVudC5fYXR0YWNoKHUse2ZhY2FkZTohMX0pLG4uaGFuZGxlLnN1Yi5maWx0ZXI9aSxuLmhhbmRsZS5zdWIucmVsUHJvcGVydHk9dGhpcy5yZWxQcm9wZXJ0eSxuLmhhbmRsZS5zdWIuX25vdGlmeT10aGlzLl9maWx0ZXJOb3RpZnl9LF9maWx0ZXJOb3RpZnk6ZnVuY3Rpb24odCxuLHMpe249bi5zbGljZSgpLHRoaXMuYXJncyYmbi5wdXNoLmFwcGx5KG4sdGhpcy5hcmdzKTt2YXIgbz1lLmRlbGVnYXRlLl9hcHBseUZpbHRlcih0aGlzLmZpbHRlcixuLHMpLHU9blswXS5yZWxhdGVkVGFyZ2V0fHxuWzBdW3RoaXMucmVsUHJvcGVydHldLGEsZixsLGMsaDtpZihvKXtvPWkobyk7Zm9yKGY9MCxsPW8ubGVuZ3RoJiYoIWF8fCFhLnN0b3BwZWQpO2Y8bDsrK2Ype2g9b1swXTtpZighcihoLHUpKXthfHwoYT1uZXcgZS5ET01FdmVudEZhY2FkZShuWzBdLGgscyksYS5jb250YWluZXI9ZS5vbmUocy5lbCkpLGEuY3VycmVudFRhcmdldD1lLm9uZShoKSxjPW5bMV0uZmlyZShhKTtpZihjPT09ITEpYnJlYWt9fX1yZXR1cm4gY30sZGV0YWNoRGVsZWdhdGU6ZnVuY3Rpb24oZSx0KXt0LmhhbmRsZS5kZXRhY2goKX19O2UuRXZlbnQuZGVmaW5lKCJtb3VzZWVudGVyIixvLCEwKSxlLkV2ZW50LmRlZmluZSgibW91c2VsZWF2ZSIsZS5tZXJnZShvLHtwcm94eVR5cGU6Im1vdXNlb3V0IixyZWxQcm9wZXJ0eToidG9FbGVtZW50In0pLCEwKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LWtleSIsZnVuY3Rpb24oZSx0KXt2YXIgbj0iK2FsdCIscj0iK2N0cmwiLGk9IittZXRhIixzPSIrc2hpZnQiLG89ZS5MYW5nLnRyaW0sdT17S0VZX01BUDp7ZW50ZXI6MTMsc3BhY2U6MzIsZXNjOjI3LGJhY2tzcGFjZTo4LHRhYjo5LHBhZ2V1cDozMyxwYWdlZG93bjozNH0sX3R5cGVSRTovXih1cHxkb3dufHByZXNzKTovLF9rZXlzUkU6L14oPzp1cHxkb3dufHByZXNzKTp8XCsoYWx0fGN0cmx8bWV0YXxzaGlmdCkvZyxwcm9jZXNzQXJnczpmdW5jdGlvbih0KXt2YXIgbj10LnNwbGljZSgzLDEpWzBdLHI9ZS5BcnJheS5oYXNoKG4ubWF0Y2goL1wrKD86YWx0fGN0cmx8bWV0YXxzaGlmdClcYi9nKXx8W10pLGk9e3R5cGU6dGhpcy5fdHlwZVJFLnRlc3Qobik/UmVnRXhwLiQxOm51bGwsbW9kczpyLGtleXM6bnVsbH0scz1uLnJlcGxhY2UodGhpcy5fa2V5c1JFLCIiKSx1LGEsZixsO2lmKHMpe3M9cy5zcGxpdCgiLCIpLGkua2V5cz17fTtmb3IobD1zLmxlbmd0aC0xO2w+PTA7LS1sKXt1PW8oc1tsXSk7aWYoIXUpY29udGludWU7K3U9PXU/aS5rZXlzW3VdPXI6KGY9dS50b0xvd2VyQ2FzZSgpLHRoaXMuS0VZX01BUFtmXT8oaS5rZXlzW3RoaXMuS0VZX01BUFtmXV09cixpLnR5cGV8fChpLnR5cGU9ImRvd24iKSk6KHU9dS5jaGFyQXQoMCksYT11LnRvVXBwZXJDYXNlKCksclsiK3NoaWZ0Il0mJih1PWEpLGkua2V5c1t1LmNoYXJDb2RlQXQoMCldPXU9PT1hP2UubWVyZ2Uocix7IitzaGlmdCI6ITB9KTpyKSl9fXJldHVybiBpLnR5cGV8fChpLnR5cGU9InByZXNzIiksaX0sb246ZnVuY3Rpb24oZSx0LG8sdSl7dmFyIGE9dC5fZXh0cmEsZj0ia2V5IithLnR5cGUsbD1hLmtleXMsYz11PyJkZWxlZ2F0ZSI6Im9uIjt0Ll9kZXRhY2g9ZVtjXShmLGZ1bmN0aW9uKGUpe3ZhciB0PWw/bFtlLndoaWNoXTphLm1vZHM7dCYmKCF0W25dfHx0W25dJiZlLmFsdEtleSkmJighdFtyXXx8dFtyXSYmZS5jdHJsS2V5KSYmKCF0W2ldfHx0W2ldJiZlLm1ldGFLZXkpJiYoIXRbc118fHRbc10mJmUuc2hpZnRLZXkpJiZvLmZpcmUoZSl9LHUpfSxkZXRhY2g6ZnVuY3Rpb24oZSx0LG4pe3QuX2RldGFjaC5kZXRhY2goKX19O3UuZGVsZWdhdGU9dS5vbix1LmRldGFjaERlbGVnYXRlPXUuZGV0YWNoLGUuRXZlbnQuZGVmaW5lKCJrZXkiLHUsITApfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1zeW50aGV0aWMiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiZXZlbnQtb3V0c2lkZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1bImJsdXIiLCJjaGFuZ2UiLCJjbGljayIsImRibGNsaWNrIiwiZm9jdXMiLCJrZXlkb3duIiwia2V5cHJlc3MiLCJrZXl1cCIsIm1vdXNlZG93biIsIm1vdXNlbW92ZSIsIm1vdXNlb3V0IiwibW91c2VvdmVyIiwibW91c2V1cCIsInNlbGVjdCIsInN1Ym1pdCJdO2UuRXZlbnQuZGVmaW5lT3V0c2lkZT1mdW5jdGlvbih0LG4pe249bnx8dCsib3V0c2lkZSI7dmFyIHI9e29uOmZ1bmN0aW9uKG4scixpKXtyLmhhbmRsZT1lLm9uZSgiZG9jIikub24odCxmdW5jdGlvbihlKXt0aGlzLmlzT3V0c2lkZShuLGUudGFyZ2V0KSYmKGUuY3VycmVudFRhcmdldD1uLGkuZmlyZShlKSl9LHRoaXMpfSxkZXRhY2g6ZnVuY3Rpb24oZSx0LG4pe3QuaGFuZGxlLmRldGFjaCgpfSxkZWxlZ2F0ZTpmdW5jdGlvbihuLHIsaSxzKXtyLmhhbmRsZT1lLm9uZSgiZG9jIikuZGVsZWdhdGUodCxmdW5jdGlvbihlKXt0aGlzLmlzT3V0c2lkZShuLGUudGFyZ2V0KSYmaS5maXJlKGUpfSxzLHRoaXMpfSxpc091dHNpZGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCE9PWUmJiF0LmFuY2VzdG9yKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZX0pfX07ci5kZXRhY2hEZWxlZ2F0ZT1yLmRldGFjaCxlLkV2ZW50LmRlZmluZShuLHIpfSxlLkFycmF5LmVhY2gobixmdW5jdGlvbih0KXtlLkV2ZW50LmRlZmluZU91dHNpZGUodCl9KX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LWZvY3VzIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHUodCxyLHUpe3ZhciBhPSJfIit0KyJOb3RpZmllcnMiO2UuRXZlbnQuZGVmaW5lKHQse191c2VBY3RpdmF0ZTpvLF9hdHRhY2g6ZnVuY3Rpb24oaSxzLG8pe3JldHVybiBlLkRPTS5pc1dpbmRvdyhpKT9uLl9hdHRhY2goW3QsZnVuY3Rpb24oZSl7cy5maXJlKGUpfSxpXSk6bi5fYXR0YWNoKFtyLHRoaXMuX3Byb3h5LGksdGhpcyxzLG9dLHtjYXB0dXJlOiEwfSl9LF9wcm94eTpmdW5jdGlvbih0LHIsaSl7dmFyIHM9dC50YXJnZXQsZj10LmN1cnJlbnRUYXJnZXQsbD1zLmdldERhdGEoYSksYz1lLnN0YW1wKGYuX25vZGUpLGg9b3x8cyE9PWYscDtyLmN1cnJlbnRUYXJnZXQ9aT9zOmYsci5jb250YWluZXI9aT9mOm51bGwsbD9oPSEwOihsPXt9LHMuc2V0RGF0YShhLGwpLGgmJihwPW4uX2F0dGFjaChbdSx0aGlzLl9ub3RpZnkscy5fbm9kZV0pLnN1YixwLm9uY2U9ITApKSxsW2NdfHwobFtjXT1bXSksbFtjXS5wdXNoKHIpLGh8fHRoaXMuX25vdGlmeSh0KX0sX25vdGlmeTpmdW5jdGlvbih0LG4pe3ZhciByPXQuY3VycmVudFRhcmdldCxpPXIuZ2V0RGF0YShhKSxvPXIuYW5jZXN0b3JzKCksdT1yLmdldCgib3duZXJEb2N1bWVudCIpLGY9W10sbD1pP2UuT2JqZWN0LmtleXMoaSkubGVuZ3RoOjAsYyxoLHAsZCx2LG0sZyx5LGIsdztyLmNsZWFyRGF0YShhKSxvLnB1c2gociksdSYmby51bnNoaWZ0KHUpLG8uX25vZGVzLnJldmVyc2UoKSxsJiYobT1sLG8uc29tZShmdW5jdGlvbih0KXt2YXIgbj1lLnN0YW1wKHQpLHI9aVtuXSxzLG87aWYocil7bC0tO2ZvcihzPTAsbz1yLmxlbmd0aDtzPG87KytzKXJbc10uaGFuZGxlLnN1Yi5maWx0ZXImJmYucHVzaChyW3NdKX1yZXR1cm4hbH0pLGw9bSk7d2hpbGUobCYmKGM9by5zaGlmdCgpKSl7ZD1lLnN0YW1wKGMpLGg9aVtkXTtpZihoKXtmb3IoZz0wLHk9aC5sZW5ndGg7Zzx5OysrZyl7cD1oW2ddLGI9cC5oYW5kbGUuc3ViLHY9ITAsdC5jdXJyZW50VGFyZ2V0PWMsYi5maWx0ZXImJih2PWIuZmlsdGVyLmFwcGx5KGMsW2MsdF0uY29uY2F0KGIuYXJnc3x8W10pKSxmLnNwbGljZShzKGYscCksMSkpLHYmJih0LmNvbnRhaW5lcj1wLmNvbnRhaW5lcix3PXAuZmlyZSh0KSk7aWYodz09PSExfHx0LnN0b3BwZWQ9PT0yKWJyZWFrfWRlbGV0ZSBoW2RdLGwtLX1pZih0LnN0b3BwZWQhPT0yKWZvcihnPTAseT1mLmxlbmd0aDtnPHk7KytnKXtwPWZbZ10sYj1wLmhhbmRsZS5zdWIsYi5maWx0ZXIuYXBwbHkoYyxbYyx0XS5jb25jYXQoYi5hcmdzfHxbXSkpJiYodC5jb250YWluZXI9cC5jb250YWluZXIsdC5jdXJyZW50VGFyZ2V0PWMsdz1wLmZpcmUodCkpO2lmKHc9PT0hMXx8dC5zdG9wcGVkPT09Mnx8dC5zdG9wcGVkJiZmW2crMV0mJmZbZysxXS5jb250YWluZXIhPT1wLmNvbnRhaW5lcilicmVha31pZih0LnN0b3BwZWQpYnJlYWt9fSxvbjpmdW5jdGlvbihlLHQsbil7dC5oYW5kbGU9dGhpcy5fYXR0YWNoKGUuX25vZGUsbil9LGRldGFjaDpmdW5jdGlvbihlLHQpe3QuaGFuZGxlLmRldGFjaCgpfSxkZWxlZ2F0ZTpmdW5jdGlvbih0LG4scixzKXtpKHMpJiYobi5maWx0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGUuU2VsZWN0b3IudGVzdChuLl9ub2RlLHMsdD09PW4/bnVsbDp0Ll9ub2RlKX0pLG4uaGFuZGxlPXRoaXMuX2F0dGFjaCh0Ll9ub2RlLHIsITApfSxkZXRhY2hEZWxlZ2F0ZTpmdW5jdGlvbihlLHQpe3QuaGFuZGxlLmRldGFjaCgpfX0sITApfXZhciBuPWUuRXZlbnQscj1lLkxhbmcsaT1yLmlzU3RyaW5nLHM9ZS5BcnJheS5pbmRleE9mLG89ZnVuY3Rpb24oKXt2YXIgdD0hMSxuPWUuY29uZmlnLmRvYyxyO3JldHVybiBuJiYocj1uLmNyZWF0ZUVsZW1lbnQoInAiKSxyLnNldEF0dHJpYnV0ZSgib25iZWZvcmVhY3RpdmF0ZSIsIjsiKSx0PXIub25iZWZvcmVhY3RpdmF0ZSE9PXVuZGVmaW5lZCksdH0oKTtvPyh1KCJmb2N1cyIsImJlZm9yZWFjdGl2YXRlIiwiZm9jdXNpbiIpLHUoImJsdXIiLCJiZWZvcmVkZWFjdGl2YXRlIiwiZm9jdXNvdXQiKSk6KHUoImZvY3VzIiwiZm9jdXMiLCJmb2N1cyIpLHUoImJsdXIiLCJibHVyIiwiYmx1ciIpKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImNsYXNzbmFtZW1hbmFnZXIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ImNsYXNzTmFtZVByZWZpeCIscj0iY2xhc3NOYW1lRGVsaW1pdGVyIixpPWUuY29uZmlnO2lbbl09aVtuXXx8Inl1aTMiLGlbcl09aVtyXXx8Ii0iLGUuQ2xhc3NOYW1lTWFuYWdlcj1mdW5jdGlvbigpe3ZhciB0PWlbbl0scz1pW3JdO3JldHVybntnZXRDbGFzc05hbWU6ZS5jYWNoZWQoZnVuY3Rpb24oKXt2YXIgbj1lLkFycmF5KGFyZ3VtZW50cyk7cmV0dXJuIG5bbi5sZW5ndGgtMV0hPT0hMD9uLnVuc2hpZnQodCk6bi5wb3AoKSxuLmpvaW4ocyl9KX19KCl9LCIzLjE3LjIiLHtyZXF1aXJlczpbInl1aS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIndpZGdldC1iYXNlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIFIoZSl7dmFyIHQ9dGhpcyxuLHIsaT10LmNvbnN0cnVjdG9yO3QuX3N0cnM9e30sdC5fY3NzUHJlZml4PWkuQ1NTX1BSRUZJWHx8cyhpLk5BTUUudG9Mb3dlckNhc2UoKSksZT1lfHx7fSxSLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0LGUpLHI9dC5nZXQoVCksciYmKHIhPT1QJiYobj1yKSx0LnJlbmRlcihuKSl9dmFyIG49ZS5MYW5nLHI9ZS5Ob2RlLGk9ZS5DbGFzc05hbWVNYW5hZ2VyLHM9aS5nZXRDbGFzc05hbWUsbyx1PWUuY2FjaGVkKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSl9KSxhPSJjb250ZW50IixmPSJ2aXNpYmxlIixsPSJoaWRkZW4iLGM9ImRpc2FibGVkIixoPSJmb2N1c2VkIixwPSJ3aWR0aCIsZD0iaGVpZ2h0Iix2PSJib3VuZGluZ0JveCIsbT0iY29udGVudEJveCIsZz0icGFyZW50Tm9kZSIseT0ib3duZXJEb2N1bWVudCIsYj0iYXV0byIsdz0ic3JjTm9kZSIsRT0iYm9keSIsUz0idGFiSW5kZXgiLHg9ImlkIixUPSJyZW5kZXIiLE49InJlbmRlcmVkIixDPSJkZXN0cm95ZWQiLGs9InN0cmluZ3MiLEw9IjxkaXY+PC9kaXY+IixBPSJDaGFuZ2UiLE89ImxvYWRpbmciLE09Il91aVNldCIsXz0iIixEPWZ1bmN0aW9uKCl7fSxQPSEwLEg9ITEsQixqPXt9LEY9W2YsYyxkLHAsaCxTXSxJPWUuVUEud2Via2l0LHE9e307Ui5OQU1FPSJ3aWRnZXQiLEI9Ui5VSV9TUkM9InVpIixSLkFUVFJTPWosalt4XT17dmFsdWVGbjoiX2d1aWQiLHdyaXRlT25jZTpQfSxqW05dPXt2YWx1ZTpILHJlYWRPbmx5OlB9LGpbdl09e3ZhbHVlRm46Il9kZWZhdWx0QkIiLHNldHRlcjoiX3NldEJCIix3cml0ZU9uY2U6UH0salttXT17dmFsdWVGbjoiX2RlZmF1bHRDQiIsc2V0dGVyOiJfc2V0Q0IiLHdyaXRlT25jZTpQfSxqW1NdPXt2YWx1ZTpudWxsLHZhbGlkYXRvcjoiX3ZhbGlkVGFiSW5kZXgifSxqW2hdPXt2YWx1ZTpILHJlYWRPbmx5OlB9LGpbY109e3ZhbHVlOkh9LGpbZl09e3ZhbHVlOlB9LGpbZF09e3ZhbHVlOl99LGpbcF09e3ZhbHVlOl99LGpba109e3ZhbHVlOnt9LHNldHRlcjoiX3N0clNldHRlciIsZ2V0dGVyOiJfc3RyR2V0dGVyIn0saltUXT17dmFsdWU6SCx3cml0ZU9uY2U6UH0sUi5DU1NfUFJFRklYPXMoUi5OQU1FLnRvTG93ZXJDYXNlKCkpLFIuZ2V0Q2xhc3NOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHMuYXBwbHkoaSxbUi5DU1NfUFJFRklYXS5jb25jYXQoZS5BcnJheShhcmd1bWVudHMpLCEwKSl9LG89Ui5nZXRDbGFzc05hbWUsUi5nZXRCeU5vZGU9ZnVuY3Rpb24odCl7dmFyIG4saT1vKCk7cmV0dXJuIHQ9ci5vbmUodCksdCYmKHQ9dC5hbmNlc3RvcigiLiIraSwhMCksdCYmKG49cVtlLnN0YW1wKHQsITApXSkpLG58fG51bGx9LGUuZXh0ZW5kKFIsZS5CYXNlLHtnZXRDbGFzc05hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gcy5hcHBseShpLFt0aGlzLl9jc3NQcmVmaXhdLmNvbmNhdChlLkFycmF5KGFyZ3VtZW50cyksITApKX0saW5pdGlhbGl6ZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5nZXQodik7biBpbnN0YW5jZW9mIHImJnRoaXMuX21hcEluc3RhbmNlKGUuc3RhbXAobikpfSxfbWFwSW5zdGFuY2U6ZnVuY3Rpb24oZSl7cVtlXT10aGlzfSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQodiksbjt0IGluc3RhbmNlb2YgciYmKG49ZS5zdGFtcCh0LCEwKSxuIGluIHEmJmRlbGV0ZSBxW25dLHRoaXMuX2Rlc3Ryb3lCb3goKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2Rlc3Ryb3lBbGxOb2Rlcz1lLFIuc3VwZXJjbGFzcy5kZXN0cm95LmFwcGx5KHRoaXMpfSxfZGVzdHJveUJveDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHYpLHQ9dGhpcy5nZXQobSksbj10aGlzLl9kZXN0cm95QWxsTm9kZXMscjtyPWUmJmUuY29tcGFyZVRvKHQpLHRoaXMuVUlfRVZFTlRTJiZ0aGlzLl9kZXN0cm95VUlFdmVudHMoKSx0aGlzLl91bmJpbmRVSShlKSx0JiYobiYmdC5lbXB0eSgpLHQucmVtb3ZlKFApKSxyfHwobiYmZS5lbXB0eSgpLGUucmVtb3ZlKFApKX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiF0aGlzLmdldChDKSYmIXRoaXMuZ2V0KE4pJiYodGhpcy5wdWJsaXNoKFQse3F1ZXVhYmxlOkgsZmlyZU9uY2U6UCxkZWZhdWx0VGFyZ2V0T25seTpQLGRlZmF1bHRGbjp0aGlzLl9kZWZSZW5kZXJGbn0pLHRoaXMuZmlyZShULHtwYXJlbnROb2RlOmU/ci5vbmUoZSk6bnVsbH0pKSx0aGlzfSxfZGVmUmVuZGVyRm46ZnVuY3Rpb24oZSl7dGhpcy5fcGFyZW50Tm9kZT1lLnBhcmVudE5vZGUsdGhpcy5yZW5kZXJlcigpLHRoaXMuX3NldChOLFApLHRoaXMuX3JlbW92ZUxvYWRpbmdDbGFzc05hbWVzKCl9LHJlbmRlcmVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLl9yZW5kZXJVSSgpLGUucmVuZGVyVUkoKSxlLl9iaW5kVUkoKSxlLmJpbmRVSSgpLGUuX3N5bmNVSSgpLGUuc3luY1VJKCl9LGJpbmRVSTpELHJlbmRlclVJOkQsc3luY1VJOkQsaGlkZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldChmLEgpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0KGYsUCl9LGZvY3VzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldChoLFApfSxibHVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldChoLEgpfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXQoYyxIKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldChjLFApfSxfdWlTaXplQ0I6ZnVuY3Rpb24oZSl7dGhpcy5nZXQobSkudG9nZ2xlQ2xhc3MobyhhLCJleHBhbmRlZCIpLGUpfSxfcmVuZGVyQm94OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10LmdldChtKSxpPXQuZ2V0KHYpLHM9dC5nZXQodyksbz10LkRFRl9QQVJFTlRfTk9ERSx1PXMmJnMuZ2V0KHkpfHxpLmdldCh5KXx8bi5nZXQoeSk7cyYmIXMuY29tcGFyZVRvKG4pJiYhbi5pbkRvYyh1KSYmcy5yZXBsYWNlKG4pLCFpLmNvbXBhcmVUbyhuLmdldChnKSkmJiFpLmNvbXBhcmVUbyhuKSYmKG4uaW5Eb2ModSkmJm4ucmVwbGFjZShpKSxpLmFwcGVuZENoaWxkKG4pKSxlPWV8fG8mJnIub25lKG8pLGU/ZS5hcHBlbmRDaGlsZChpKTppLmluRG9jKHUpfHxyLm9uZShFKS5pbnNlcnQoaSwwKX0sX3NldEJCOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZXRCb3godGhpcy5nZXQoeCksZSx0aGlzLkJPVU5ESU5HX1RFTVBMQVRFLCEwKX0sX3NldENCOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLkNPTlRFTlRfVEVNUExBVEU9PT1udWxsP3RoaXMuZ2V0KHYpOnRoaXMuX3NldEJveChudWxsLGUsdGhpcy5DT05URU5UX1RFTVBMQVRFLCExKX0sX2RlZmF1bHRCQjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHcpLHQ9dGhpcy5DT05URU5UX1RFTVBMQVRFPT09bnVsbDtyZXR1cm4gZSYmdD9lOm51bGx9LF9kZWZhdWx0Q0I6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0KHcpfHxudWxsfSxfc2V0Qm94OmZ1bmN0aW9uKHQsbixpLHMpe3JldHVybiBuPXIub25lKG4pLG58fChuPXIuY3JlYXRlKGkpLHM/dGhpcy5fYmJGcm9tVGVtcGxhdGU9ITA6dGhpcy5fY2JGcm9tVGVtcGxhdGU9ITApLG4uZ2V0KHgpfHxuLnNldCh4LHR8fGUuZ3VpZCgpKSxufSxfcmVuZGVyVUk6ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJCb3hDbGFzc05hbWVzKCksdGhpcy5fcmVuZGVyQm94KHRoaXMuX3BhcmVudE5vZGUpfSxfcmVuZGVyQm94Q2xhc3NOYW1lczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2dldENsYXNzZXMoKSx0LG49dGhpcy5nZXQodikscjtuLmFkZENsYXNzKG8oKSk7Zm9yKHI9ZS5sZW5ndGgtMztyPj0wO3ItLSl0PWVbcl0sbi5hZGRDbGFzcyh0LkNTU19QUkVGSVh8fHModC5OQU1FLnRvTG93ZXJDYXNlKCkpKTt0aGlzLmdldChtKS5hZGRDbGFzcyh0aGlzLmdldENsYXNzTmFtZShhKSl9LF9yZW1vdmVMb2FkaW5nQ2xhc3NOYW1lczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHYpLHQ9dGhpcy5nZXQobSksbj10aGlzLmdldENsYXNzTmFtZShPKSxyPW8oTyk7ZS5yZW1vdmVDbGFzcyhyKS5yZW1vdmVDbGFzcyhuKSx0LnJlbW92ZUNsYXNzKHIpLnJlbW92ZUNsYXNzKG4pfSxfYmluZFVJOmZ1bmN0aW9uKCl7dGhpcy5fYmluZEF0dHJVSSh0aGlzLl9VSV9BVFRSUy5CSU5EKSx0aGlzLl9iaW5kRE9NKCl9LF91bmJpbmRVSTpmdW5jdGlvbihlKXt0aGlzLl91bmJpbmRET00oZSl9LF9iaW5kRE9NOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQodikuZ2V0KHkpLG49Ui5faERvY0ZvY3VzO258fChuPVIuX2hEb2NGb2N1cz10Lm9uKCJmb2N1cyIsdGhpcy5fb25Eb2NGb2N1cyx0aGlzKSxuLmxpc3RlbmVycz17Y291bnQ6MH0pLG4ubGlzdGVuZXJzW2Uuc3RhbXAodGhpcywhMCldPSEwLG4ubGlzdGVuZXJzLmNvdW50KyssSSYmKHRoaXMuX2hEb2NNb3VzZURvd249dC5vbigibW91c2Vkb3duIix0aGlzLl9vbkRvY01vdXNlRG93bix0aGlzKSl9LF91bmJpbmRET006ZnVuY3Rpb24odCl7dmFyIG49Ui5faERvY0ZvY3VzLHI9ZS5zdGFtcCh0aGlzLCEwKSxpLHM9dGhpcy5faERvY01vdXNlRG93bjtuJiYoaT1uLmxpc3RlbmVycyxpW3JdJiYoZGVsZXRlIGlbcl0saS5jb3VudC0tKSxpLmNvdW50PT09MCYmKG4uZGV0YWNoKCksUi5faERvY0ZvY3VzPW51bGwpKSxJJiZzJiZzLmRldGFjaCgpfSxfc3luY1VJOmZ1bmN0aW9uKCl7dGhpcy5fc3luY0F0dHJVSSh0aGlzLl9VSV9BVFRSUy5TWU5DKX0sX3VpU2V0SGVpZ2h0OmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0RGltKGQsZSksdGhpcy5fdWlTaXplQ0IoZSE9PV8mJmUhPT1iKX0sX3VpU2V0V2lkdGg6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXREaW0ocCxlKX0sX3VpU2V0RGltOmZ1bmN0aW9uKGUsdCl7dGhpcy5nZXQodikuc2V0U3R5bGUoZSxuLmlzTnVtYmVyKHQpP3QrdGhpcy5ERUZfVU5JVDp0KX0sX3VpU2V0VmlzaWJsZTpmdW5jdGlvbihlKXt0aGlzLmdldCh2KS50b2dnbGVDbGFzcyh0aGlzLmdldENsYXNzTmFtZShsKSwhZSl9LF91aVNldERpc2FibGVkOmZ1bmN0aW9uKGUpe3RoaXMuZ2V0KHYpLnRvZ2dsZUNsYXNzKHRoaXMuZ2V0Q2xhc3NOYW1lKGMpLGUpfSxfdWlTZXRGb2N1c2VkOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXQodik7bi50b2dnbGVDbGFzcyh0aGlzLmdldENsYXNzTmFtZShoKSxlKSx0IT09QiYmKGU/bi5mb2N1cygpOm4uYmx1cigpKX0sX3VpU2V0VGFiSW5kZXg6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXQodik7bi5pc051bWJlcihlKT90LnNldChTLGUpOnQucmVtb3ZlQXR0cmlidXRlKFMpfSxfb25Eb2NNb3VzZURvd246ZnVuY3Rpb24oZSl7dGhpcy5fZG9tRm9jdXMmJnRoaXMuX29uRG9jRm9jdXMoZSl9LF9vbkRvY0ZvY3VzOmZ1bmN0aW9uKGUpe3ZhciB0PVIuZ2V0QnlOb2RlKGUudGFyZ2V0KSxuPVIuX2FjdGl2ZTtuJiZuIT09dCYmKG4uX2RvbUZvY3VzPSExLG4uX3NldChoLCExLHtzcmM6Qn0pLFIuX2FjdGl2ZT1udWxsKSx0JiYodC5fZG9tRm9jdXM9ITAsdC5fc2V0KGgsITAse3NyYzpCfSksUi5fYWN0aXZlPXQpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIlsiK3RoaXMuZ2V0KHgpKyJdIn0sREVGX1VOSVQ6InB4IixERUZfUEFSRU5UX05PREU6bnVsbCxDT05URU5UX1RFTVBMQVRFOkwsQk9VTkRJTkdfVEVNUExBVEU6TCxfZ3VpZDpmdW5jdGlvbigpe3JldHVybiBlLmd1aWQoKX0sX3ZhbGlkVGFiSW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIG4uaXNOdW1iZXIoZSl8fG4uaXNOdWxsKGUpfSxfYmluZEF0dHJVSTpmdW5jdGlvbihlKXt2YXIgdCxuPWUubGVuZ3RoO2Zvcih0PTA7dDxuO3QrKyl0aGlzLmFmdGVyKGVbdF0rQSx0aGlzLl9zZXRBdHRyVUkpfSxfc3luY0F0dHJVSTpmdW5jdGlvbihlKXt2YXIgdCxuPWUubGVuZ3RoLHI7Zm9yKHQ9MDt0PG47dCsrKXI9ZVt0XSx0aGlzW00rdShyKV0odGhpcy5nZXQocikpfSxfc2V0QXR0clVJOmZ1bmN0aW9uKGUpe2UudGFyZ2V0PT09dGhpcyYmdGhpc1tNK3UoZS5hdHRyTmFtZQopXShlLm5ld1ZhbCxlLnNyYyl9LF9zdHJTZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGUubWVyZ2UodGhpcy5nZXQoayksdCl9LGdldFN0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXQoaylbZV19LGdldFN0cmluZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoayl9LF9VSV9BVFRSUzp7QklORDpGLFNZTkM6Rn19KSxlLldpZGdldD1SfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJhdHRyaWJ1dGUiLCJiYXNlLWJhc2UiLCJiYXNlLXBsdWdpbmhvc3QiLCJjbGFzc25hbWVtYW5hZ2VyIiwiZXZlbnQtZm9jdXMiLCJub2RlLWJhc2UiLCJub2RlLXN0eWxlIl0sc2tpbm5hYmxlOiEwfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtaHRtbHBhcnNlciIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLldpZGdldCxyPWUuTm9kZSxpPWUuTGFuZyxzPSJzcmNOb2RlIixvPSJjb250ZW50Qm94IjtuLkhUTUxfUEFSU0VSPXt9LG4uX2J1aWxkQ2ZnPXthZ2dyZWdhdGVzOlsiSFRNTF9QQVJTRVIiXX0sbi5BVFRSU1tzXT17dmFsdWU6bnVsbCxzZXR0ZXI6ci5vbmUsZ2V0dGVyOiJfZ2V0U3JjTm9kZSIsd3JpdGVPbmNlOiEwfSxlLm1peChuLnByb3RvdHlwZSx7X2dldFNyY05vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGV8fHRoaXMuZ2V0KG8pfSxfcHJlQWRkQXR0cnM6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXtpZDplLmlkLGJvdW5kaW5nQm94OmUuYm91bmRpbmdCb3gsY29udGVudEJveDplLmNvbnRlbnRCb3gsc3JjTm9kZTplLnNyY05vZGV9O3RoaXMuYWRkQXR0cnMocix0LG4pLGRlbGV0ZSBlLmJvdW5kaW5nQm94LGRlbGV0ZSBlLmNvbnRlbnRCb3gsZGVsZXRlIGUuc3JjTm9kZSxkZWxldGUgZS5pZCx0aGlzLl9hcHBseVBhcnNlciYmdGhpcy5fYXBwbHlQYXJzZXIodCl9LF9hcHBseVBhcnNlZENvbmZpZzpmdW5jdGlvbih0LG4scil7cmV0dXJuIHI/ZS5taXgobixyLCExKTpufSxfYXBwbHlQYXJzZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPXRoaXMuX2dldE5vZGVUb1BhcnNlKCkscz1uLl9nZXRIdG1sUGFyc2VyKCksbyx1O3MmJnImJmUuT2JqZWN0LmVhY2gocyxmdW5jdGlvbihlLHQscyl7dT1udWxsLGkuaXNGdW5jdGlvbihlKT91PWUuY2FsbChuLHIpOmkuaXNBcnJheShlKT8odT1yLmFsbChlWzBdKSx1LmlzRW1wdHkoKSYmKHU9bnVsbCkpOnU9ci5vbmUoZSksdSE9PW51bGwmJnUhPT11bmRlZmluZWQmJihvPW98fHt9LG9bdF09dSl9KSx0PW4uX2FwcGx5UGFyc2VkQ29uZmlnKHIsdCxvKX0sX2dldE5vZGVUb1BhcnNlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXQoInNyY05vZGUiKTtyZXR1cm4gdGhpcy5fY2JGcm9tVGVtcGxhdGU/bnVsbDplfSxfZ2V0SHRtbFBhcnNlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldENsYXNzZXMoKSxuPXt9LHIsaTtmb3Iocj10Lmxlbmd0aC0xO3I+PTA7ci0tKWk9dFtyXS5IVE1MX1BBUlNFUixpJiZlLm1peChuLGksITApO3JldHVybiBufX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ3aWRnZXQtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtc2tpbiIsZnVuY3Rpb24oZSx0KXt2YXIgbj0iYm91bmRpbmdCb3giLHI9ImNvbnRlbnRCb3giLGk9InNraW4iLHM9ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZTtlLldpZGdldC5wcm90b3R5cGUuZ2V0U2tpbk5hbWU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXQocil8fHRoaXMuZ2V0KG4pLG8sdTtyZXR1cm4gZT1lfHxzKGksIiIpLHU9bmV3IFJlZ0V4cCgiXFxiIitlKyIoXFxTKykiKSx0JiZ0LmFuY2VzdG9yKGZ1bmN0aW9uKGUpe3JldHVybiBvPWUuZ2V0KCJjbGFzc05hbWUiKS5tYXRjaCh1KSxvfSksbz9vWzFdOm51bGx9fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ3aWRnZXQtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtdWlldmVudHMiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ImJvdW5kaW5nQm94IixyPWUuV2lkZ2V0LGk9InJlbmRlciIscz1lLkxhbmcsbz0iOiIsdT1lLldpZGdldC5fdWlldnRzPWUuV2lkZ2V0Ll91aWV2dHN8fHt9O2UubWl4KHIucHJvdG90eXBlLHtfZGVzdHJveVVJRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5zdGFtcCh0aGlzLCEwKTtlLmVhY2godSxmdW5jdGlvbihuLHIpe24uaW5zdGFuY2VzW3RdJiYoZGVsZXRlIG4uaW5zdGFuY2VzW3RdLGUuT2JqZWN0LmlzRW1wdHkobi5pbnN0YW5jZXMpJiYobi5oYW5kbGUuZGV0YWNoKCksdVtyXSYmZGVsZXRlIHVbcl0pKX0pfSxVSV9FVkVOVFM6ZS5Ob2RlLkRPTV9FVkVOVFMsX2dldFVJRXZlbnROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KG4pfSxfY3JlYXRlVUlFdmVudDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRVSUV2ZW50Tm9kZSgpLGk9ZS5zdGFtcChuKSt0LHM9dVtpXSxvO3N8fChvPW4uZGVsZWdhdGUodCxmdW5jdGlvbihlKXt2YXIgdD1yLmdldEJ5Tm9kZSh0aGlzKTt0JiZ0Ll9maWx0ZXJVSUV2ZW50KGUpJiZ0LmZpcmUoZS50eXBlLHtkb21FdmVudDplfSl9LCIuIitlLldpZGdldC5nZXRDbGFzc05hbWUoKSksdVtpXT1zPXtpbnN0YW5jZXM6e30saGFuZGxlOm99KSxzLmluc3RhbmNlc1tlLnN0YW1wKHRoaXMpXT0xfSxfZmlsdGVyVUlFdmVudDpmdW5jdGlvbihlKXtyZXR1cm4gZS5jdXJyZW50VGFyZ2V0LmNvbXBhcmVUbyhlLmNvbnRhaW5lcil8fGUuY29udGFpbmVyLmNvbXBhcmVUbyh0aGlzLl9nZXRVSUV2ZW50Tm9kZSgpKX0sX2dldFVJRXZlbnQ6ZnVuY3Rpb24oZSl7aWYocy5pc1N0cmluZyhlKSl7dmFyIHQ9dGhpcy5wYXJzZVR5cGUoZSlbMV0sbixyO3JldHVybiB0JiYobj10LmluZGV4T2Yobyksbj4tMSYmKHQ9dC5zdWJzdHJpbmcobitvLmxlbmd0aCkpLHRoaXMuVUlfRVZFTlRTW3RdJiYocj10KSkscn19LF9pbml0VUlFdmVudDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRVSUV2ZW50KGUpLG49dGhpcy5fdWlFdnRzSW5pdFF1ZXVlfHx7fTt0JiYhblt0XSYmKHRoaXMuX3VpRXZ0c0luaXRRdWV1ZT1uW3RdPTEsdGhpcy5hZnRlcihpLGZ1bmN0aW9uKCl7dGhpcy5fY3JlYXRlVUlFdmVudCh0KSxkZWxldGUgdGhpcy5fdWlFdnRzSW5pdFF1ZXVlW3RdfSkpfSxvbjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faW5pdFVJRXZlbnQoZSksci5zdXBlcmNsYXNzLm9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scHVibGlzaDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2dldFVJRXZlbnQoZSk7cmV0dXJuIG4mJnQmJnQuZGVmYXVsdEZuJiZ0aGlzLl9pbml0VUlFdmVudChuKSxyLnN1cGVyY2xhc3MucHVibGlzaC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSwhMCl9LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUtZXZlbnQtZGVsZWdhdGUiLCJ3aWRnZXQtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtc3RkbW9kIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIEgoZSl7fXZhciBuPWUuTGFuZyxyPWUuTm9kZSxpPWUuVUEscz1lLldpZGdldCxvPSIiLHU9ImhkIixhPSJiZCIsZj0iZnQiLGw9ImhlYWRlciIsYz0iYm9keSIsaD0iZm9vdGVyIixwPSJmaWxsSGVpZ2h0IixkPSJzdGRtb2QiLHY9Ik5vZGUiLG09IkNvbnRlbnQiLGc9ImZpcnN0Q2hpbGQiLHk9ImNoaWxkTm9kZXMiLGI9Im93bmVyRG9jdW1lbnQiLHc9ImNvbnRlbnRCb3giLEU9ImhlaWdodCIsUz0ib2Zmc2V0SGVpZ2h0Iix4PSJhdXRvIixUPSJoZWFkZXJDb250ZW50Q2hhbmdlIixOPSJib2R5Q29udGVudENoYW5nZSIsQz0iZm9vdGVyQ29udGVudENoYW5nZSIsaz0iZmlsbEhlaWdodENoYW5nZSIsTD0iaGVpZ2h0Q2hhbmdlIixBPSJjb250ZW50VXBkYXRlIixPPSJyZW5kZXJVSSIsTT0iYmluZFVJIixfPSJzeW5jVUkiLEQ9Il9hcHBseVBhcnNlZENvbmZpZyIsUD1lLldpZGdldC5VSV9TUkM7SC5IRUFERVI9bCxILkJPRFk9YyxILkZPT1RFUj1oLEguQUZURVI9ImFmdGVyIixILkJFRk9SRT0iYmVmb3JlIixILlJFUExBQ0U9InJlcGxhY2UiO3ZhciBCPUguSEVBREVSLGo9SC5CT0RZLEY9SC5GT09URVIsST1CK20scT1GK20sUj1qK207SC5BVFRSUz17aGVhZGVyQ29udGVudDp7dmFsdWU6bnVsbH0sZm9vdGVyQ29udGVudDp7dmFsdWU6bnVsbH0sYm9keUNvbnRlbnQ6e3ZhbHVlOm51bGx9LGZpbGxIZWlnaHQ6e3ZhbHVlOkguQk9EWSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlRmlsbEhlaWdodChlKX19fSxILkhUTUxfUEFSU0VSPXtoZWFkZXJDb250ZW50OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wYXJzZVN0ZE1vZEhUTUwoQil9LGJvZHlDb250ZW50OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wYXJzZVN0ZE1vZEhUTUwoail9LGZvb3RlckNvbnRlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3BhcnNlU3RkTW9kSFRNTChGKX19LEguU0VDVElPTl9DTEFTU19OQU1FUz17aGVhZGVyOnMuZ2V0Q2xhc3NOYW1lKHUpLGJvZHk6cy5nZXRDbGFzc05hbWUoYSksZm9vdGVyOnMuZ2V0Q2xhc3NOYW1lKGYpfSxILlRFTVBMQVRFUz17aGVhZGVyOic8ZGl2IGNsYXNzPSInK0guU0VDVElPTl9DTEFTU19OQU1FU1tCXSsnIj48L2Rpdj4nLGJvZHk6JzxkaXYgY2xhc3M9IicrSC5TRUNUSU9OX0NMQVNTX05BTUVTW2pdKyciPjwvZGl2PicsZm9vdGVyOic8ZGl2IGNsYXNzPSInK0guU0VDVElPTl9DTEFTU19OQU1FU1tGXSsnIj48L2Rpdj4nfSxILnByb3RvdHlwZT17aW5pdGlhbGl6ZXI6ZnVuY3Rpb24oKXt0aGlzLl9zdGRNb2ROb2RlPXRoaXMuZ2V0KHcpLGUuYmVmb3JlKHRoaXMuX3JlbmRlclVJU3RkTW9kLHRoaXMsTyksZS5iZWZvcmUodGhpcy5fYmluZFVJU3RkTW9kLHRoaXMsTSksZS5iZWZvcmUodGhpcy5fc3luY1VJU3RkTW9kLHRoaXMsXyl9LF9zeW5jVUlTdGRNb2Q6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9zdGRNb2RQYXJzZWQ7KCFlfHwhZVtJXSkmJnRoaXMuX3VpU2V0U3RkTW9kKEIsdGhpcy5nZXQoSSkpLCghZXx8IWVbUl0pJiZ0aGlzLl91aVNldFN0ZE1vZChqLHRoaXMuZ2V0KFIpKSwoIWV8fCFlW3FdKSYmdGhpcy5fdWlTZXRTdGRNb2QoRix0aGlzLmdldChxKSksdGhpcy5fdWlTZXRGaWxsSGVpZ2h0KHRoaXMuZ2V0KHApKX0sX3JlbmRlclVJU3RkTW9kOmZ1bmN0aW9uKCl7dGhpcy5fc3RkTW9kTm9kZS5hZGRDbGFzcyhzLmdldENsYXNzTmFtZShkKSksdGhpcy5fcmVuZGVyU3RkTW9kU2VjdGlvbnMoKSx0aGlzLmFmdGVyKFQsdGhpcy5fYWZ0ZXJIZWFkZXJDaGFuZ2UpLHRoaXMuYWZ0ZXIoTix0aGlzLl9hZnRlckJvZHlDaGFuZ2UpLHRoaXMuYWZ0ZXIoQyx0aGlzLl9hZnRlckZvb3RlckNoYW5nZSl9LF9yZW5kZXJTdGRNb2RTZWN0aW9uczpmdW5jdGlvbigpe24uaXNWYWx1ZSh0aGlzLmdldChJKSkmJnRoaXMuX3JlbmRlclN0ZE1vZChCKSxuLmlzVmFsdWUodGhpcy5nZXQoUikpJiZ0aGlzLl9yZW5kZXJTdGRNb2Qoaiksbi5pc1ZhbHVlKHRoaXMuZ2V0KHEpKSYmdGhpcy5fcmVuZGVyU3RkTW9kKEYpfSxfYmluZFVJU3RkTW9kOmZ1bmN0aW9uKCl7dGhpcy5hZnRlcihrLHRoaXMuX2FmdGVyRmlsbEhlaWdodENoYW5nZSksdGhpcy5hZnRlcihMLHRoaXMuX2ZpbGxIZWlnaHQpLHRoaXMuYWZ0ZXIoQSx0aGlzLl9maWxsSGVpZ2h0KX0sX2FmdGVySGVhZGVyQ2hhbmdlOmZ1bmN0aW9uKGUpe2Uuc3JjIT09UCYmdGhpcy5fdWlTZXRTdGRNb2QoQixlLm5ld1ZhbCxlLnN0ZE1vZFBvc2l0aW9uKX0sX2FmdGVyQm9keUNoYW5nZTpmdW5jdGlvbihlKXtlLnNyYyE9PVAmJnRoaXMuX3VpU2V0U3RkTW9kKGosZS5uZXdWYWwsZS5zdGRNb2RQb3NpdGlvbil9LF9hZnRlckZvb3RlckNoYW5nZTpmdW5jdGlvbihlKXtlLnNyYyE9PVAmJnRoaXMuX3VpU2V0U3RkTW9kKEYsZS5uZXdWYWwsZS5zdGRNb2RQb3NpdGlvbil9LF9hZnRlckZpbGxIZWlnaHRDaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRGaWxsSGVpZ2h0KGUubmV3VmFsKX0sX3ZhbGlkYXRlRmlsbEhlaWdodDpmdW5jdGlvbihlKXtyZXR1cm4hZXx8ZT09SC5CT0RZfHxlPT1ILkhFQURFUnx8ZT09SC5GT09URVJ9LF91aVNldEZpbGxIZWlnaHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRTdGRNb2ROb2RlKGUpLG49dGhpcy5fY3VyckZpbGxOb2RlO24mJnQhPT1uJiZuLnNldFN0eWxlKEUsbyksdCYmKHRoaXMuX2N1cnJGaWxsTm9kZT10KSx0aGlzLl9maWxsSGVpZ2h0KCl9LF9maWxsSGVpZ2h0OmZ1bmN0aW9uKCl7aWYodGhpcy5nZXQocCkpe3ZhciBlPXRoaXMuZ2V0KEUpO2UhPW8mJmUhPXgmJnRoaXMuZmlsbEhlaWdodCh0aGlzLmdldFN0ZE1vZE5vZGUodGhpcy5nZXQocCkpKX19LF91aVNldFN0ZE1vZDpmdW5jdGlvbihlLHQscil7aWYobi5pc1ZhbHVlKHQpKXt2YXIgaT10aGlzLmdldFN0ZE1vZE5vZGUoZSwhMCk7dGhpcy5fYWRkU3RkTW9kQ29udGVudChpLHQsciksdGhpcy5zZXQoZSttLHRoaXMuX2dldFN0ZE1vZENvbnRlbnQoZSkse3NyYzpQfSl9ZWxzZSB0aGlzLl9lcmFzZVN0ZE1vZChlKTt0aGlzLmZpcmUoQSl9LF9yZW5kZXJTdGRNb2Q6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXQodyksbj10aGlzLl9maW5kU3RkTW9kU2VjdGlvbihlKTtyZXR1cm4gbnx8KG49dGhpcy5fZ2V0U3RkTW9kVGVtcGxhdGUoZSkpLHRoaXMuX2luc2VydFN0ZE1vZFNlY3Rpb24odCxlLG4pLHRoaXNbZSt2XT1uLHRoaXNbZSt2XX0sX2VyYXNlU3RkTW9kOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0U3RkTW9kTm9kZShlKTt0JiYodC5yZW1vdmUoITApLGRlbGV0ZSB0aGlzW2Urdl0pfSxfaW5zZXJ0U3RkTW9kU2VjdGlvbjpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXQoZyk7aWYodD09PUZ8fCFyKWUuYXBwZW5kQ2hpbGQobik7ZWxzZSBpZih0PT09QillLmluc2VydEJlZm9yZShuLHIpO2Vsc2V7dmFyIGk9dGhpc1tGK3ZdO2k/ZS5pbnNlcnRCZWZvcmUobixpKTplLmFwcGVuZENoaWxkKG4pfX0sX2dldFN0ZE1vZFRlbXBsYXRlOmZ1bmN0aW9uKGUpe3JldHVybiByLmNyZWF0ZShILlRFTVBMQVRFU1tlXSx0aGlzLl9zdGRNb2ROb2RlLmdldChiKSl9LF9hZGRTdGRNb2RDb250ZW50OmZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2gobil7Y2FzZSBILkJFRk9SRTpuPTA7YnJlYWs7Y2FzZSBILkFGVEVSOm49dW5kZWZpbmVkO2JyZWFrO2RlZmF1bHQ6bj1ILlJFUExBQ0V9ZS5pbnNlcnQodCxuKX0sX2dldFByZWNpc2VIZWlnaHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZT9lLmdldChTKTowLG49ImdldEJvdW5kaW5nQ2xpZW50UmVjdCI7aWYoZSYmZS5oYXNNZXRob2Qobikpe3ZhciByPWUuaW52b2tlKG4pO3ImJih0PXIuYm90dG9tLXIudG9wKX1yZXR1cm4gdH0sX2ZpbmRTdGRNb2RTZWN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldCh3KS5vbmUoIj4gLiIrSC5TRUNUSU9OX0NMQVNTX05BTUVTW2VdKX0sX3BhcnNlU3RkTW9kSFRNTDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9maW5kU3RkTW9kU2VjdGlvbih0KTtyZXR1cm4gbj8odGhpcy5fc3RkTW9kUGFyc2VkfHwodGhpcy5fc3RkTW9kUGFyc2VkPXt9LGUuYmVmb3JlKHRoaXMuX2FwcGx5U3RkTW9kUGFyc2VkQ29uZmlnLHRoaXMsRCkpLHRoaXMuX3N0ZE1vZFBhcnNlZFt0K21dPTEsbi5nZXQoImlubmVySFRNTCIpKTpudWxsfSxfYXBwbHlTdGRNb2RQYXJzZWRDb25maWc6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX3N0ZE1vZFBhcnNlZDtyJiYocltJXT0hKEkgaW4gdCkmJkkgaW4gcixyW1JdPSEoUiBpbiB0KSYmUiBpbiByLHJbcV09IShxIGluIHQpJiZxIGluIHIpfSxfZ2V0U3RkTW9kQ29udGVudDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpc1tlK3ZdP3RoaXNbZSt2XS5nZXQoeSk6bnVsbH0sc2V0U3RkTW9kQ29udGVudDpmdW5jdGlvbihlLHQsbil7dGhpcy5zZXQoZSttLHQse3N0ZE1vZFBvc2l0aW9uOm59KX0sZ2V0U3RkTW9kTm9kZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbZSt2XXx8bnVsbDtyZXR1cm4hbiYmdCYmKG49dGhpcy5fcmVuZGVyU3RkTW9kKGUpKSxufSxmaWxsSGVpZ2h0OmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PXRoaXMuZ2V0KHcpLHI9W3RoaXMuaGVhZGVyTm9kZSx0aGlzLmJvZHlOb2RlLHRoaXMuZm9vdGVyTm9kZV0scyxvLHU9MCxhPTAsZj0hMTtmb3IodmFyIGw9MCxjPXIubGVuZ3RoO2w8YztsKyspcz1yW2xdLHMmJihzIT09ZT91Kz10aGlzLl9nZXRQcmVjaXNlSGVpZ2h0KHMpOmY9ITApO2YmJigoaS5pZXx8aS5vcGVyYSkmJmUuc2V0KFMsMCksbz10LmdldChTKS1wYXJzZUludCh0LmdldENvbXB1dGVkU3R5bGUoInBhZGRpbmdUb3AiKSwxMCktcGFyc2VJbnQodC5nZXRDb21wdXRlZFN0eWxlKCJwYWRkaW5nQm90dG9tIiksMTApLXBhcnNlSW50KHQuZ2V0Q29tcHV0ZWRTdHlsZSgiYm9yZGVyQm90dG9tV2lkdGgiKSwxMCktcGFyc2VJbnQodC5nZXRDb21wdXRlZFN0eWxlKCJib3JkZXJUb3BXaWR0aCIpLDEwKSxuLmlzTnVtYmVyKG8pJiYoYT1vLXUsYT49MCYmZS5zZXQoUyxhKSkpfX19LGUuV2lkZ2V0U3RkTW9kPUh9LCIzLjE3LjIiLHtyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJ3aWRnZXQiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgid2lkZ2V0LXBvc2l0aW9uIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGQoZSl7fXZhciBuPWUuTGFuZyxyPWUuV2lkZ2V0LGk9Inh5IixzPSJwb3NpdGlvbiIsbz0icG9zaXRpb25lZCIsdT0iYm91bmRpbmdCb3giLGE9InJlbGF0aXZlIixmPSJyZW5kZXJVSSIsbD0iYmluZFVJIixjPSJzeW5jVUkiLGg9ci5VSV9TUkMscD0ieHlDaGFuZ2UiO2QuQVRUUlM9e3g6e3NldHRlcjpmdW5jdGlvbihlKXt0aGlzLl9zZXRYKGUpfSxnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0WCgpfSxsYXp5QWRkOiExfSx5OntzZXR0ZXI6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0WShlKX0sZ2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFkoKX0sbGF6eUFkZDohMX0seHk6e3ZhbHVlOlswLDBdLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fdmFsaWRhdGVYWShlKX19fSxkLlBPU0lUSU9ORURfQ0xBU1NfTkFNRT1yLmdldENsYXNzTmFtZShvKSxkLnByb3RvdHlwZT17aW5pdGlhbGl6ZXI6ZnVuY3Rpb24oKXt0aGlzLl9wb3NOb2RlPXRoaXMuZ2V0KHUpLGUuYWZ0ZXIodGhpcy5fcmVuZGVyVUlQb3NpdGlvbix0aGlzLGYpLGUuYWZ0ZXIodGhpcy5fc3luY1VJUG9zaXRpb24sdGhpcyxjKSxlLmFmdGVyKHRoaXMuX2JpbmRVSVBvc2l0aW9uLHRoaXMsbCl9LF9yZW5kZXJVSVBvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fcG9zTm9kZS5hZGRDbGFzcyhkLlBPU0lUSU9ORURfQ0xBU1NfTkFNRSl9LF9zeW5jVUlQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3Bvc05vZGU7ZS5nZXRTdHlsZShzKT09PWEmJnRoaXMuc3luY1hZKCksdGhpcy5fdWlTZXRYWSh0aGlzLmdldChpKSl9LF9iaW5kVUlQb3NpdGlvbjpmdW5jdGlvbigpe3RoaXMuYWZ0ZXIocCx0aGlzLl9hZnRlclhZQ2hhbmdlKX0sbW92ZTpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cyx0PW4uaXNBcnJheShlWzBdKT9lWzBdOltlWzBdLGVbMV1dO3RoaXMuc2V0KGksdCl9LHN5bmNYWTpmdW5jdGlvbigpe3RoaXMuc2V0KGksdGhpcy5fcG9zTm9kZS5nZXRYWSgpLHtzcmM6aH0pfSxfdmFsaWRhdGVYWTpmdW5jdGlvbihlKXtyZXR1cm4gbi5pc0FycmF5KGUpJiZuLmlzTnVtYmVyKGVbMF0pJiZuLmlzTnVtYmVyKGVbMV0pfSxfc2V0WDpmdW5jdGlvbihlKXt0aGlzLnNldChpLFtlLHRoaXMuZ2V0KGkpWzFdXSl9LF9zZXRZOmZ1bmN0aW9uKGUpe3RoaXMuc2V0KGksW3RoaXMuZ2V0KGkpWzBdLGVdKX0sX2dldFg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoaSlbMF19LF9nZXRZOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KGkpWzFdfSxfYWZ0ZXJYWUNoYW5nZTpmdW5jdGlvbihlKXtlLnNyYyE9aCYmdGhpcy5fdWlTZXRYWShlLm5ld1ZhbCl9LF91aVNldFhZOmZ1bmN0aW9uKGUpe3RoaXMuX3Bvc05vZGUuc2V0WFkoZSl9fSxlLldpZGdldFBvc2l0aW9uPWR9LCIzLjE3LjIiLHtyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJub2RlLXNjcmVlbiIsIndpZGdldCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtcG9zaXRpb24tYWxpZ24iLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gYyhlKXt9dmFyIG49ZS5MYW5nLHI9ImFsaWduIixpPSJhbGlnbk9uIixzPSJ2aXNpYmxlIixvPSJib3VuZGluZ0JveCIsdT0ib2Zmc2V0V2lkdGgiLGE9Im9mZnNldEhlaWdodCIsZj0icmVnaW9uIixsPSJ2aWV3cG9ydFJlZ2lvbiI7Yy5BVFRSUz17YWxpZ246e3ZhbHVlOm51bGx9LGNlbnRlcmVkOntzZXR0ZXI6Il9zZXRBbGlnbkNlbnRlciIsbGF6eUFkZDohMSx2YWx1ZTohMX0sYWxpZ25Pbjp7dmFsdWU6W10sdmFsaWRhdG9yOmUuTGFuZy5pc0FycmF5fX0sYy5UTD0idGwiLGMuVFI9InRyIixjLkJMPSJibCIsYy5CUj0iYnIiLGMuVEM9InRjIixjLlJDPSJyYyIsYy5CQz0iYmMiLGMuTEM9ImxjIixjLkNDPSJjYyIsYy5wcm90b3R5cGU9e2luaXRpYWxpemVyOmZ1bmN0aW9uKCl7dGhpcy5fcG9zTm9kZXx8ZS5lcnJvcigiV2lkZ2V0UG9zaXRpb24gbmVlZHMgdG8gYmUgYWRkZWQgdG8gdGhlIFdpZGdldCwgYmVmb3JlIFdpZGdldFBvc2l0aW9uQWxpZ24gaXMgYWRkZWQiKSxlLmFmdGVyKHRoaXMuX2JpbmRVSVBvc0FsaWduLHRoaXMsImJpbmRVSSIpLGUuYWZ0ZXIodGhpcy5fc3luY1VJUG9zQWxpZ24sdGhpcywic3luY1VJIil9LF9wb3NBbGlnblVJSGFuZGxlczpudWxsLGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl9kZXRhY2hQb3NBbGlnblVJSGFuZGxlcygpfSxfYmluZFVJUG9zQWxpZ246ZnVuY3Rpb24oKXt0aGlzLmFmdGVyKCJhbGlnbkNoYW5nZSIsdGhpcy5fYWZ0ZXJBbGlnbkNoYW5nZSksdGhpcy5hZnRlcigiYWxpZ25PbkNoYW5nZSIsdGhpcy5fYWZ0ZXJBbGlnbk9uQ2hhbmdlKSx0aGlzLmFmdGVyKCJ2aXNpYmxlQ2hhbmdlIix0aGlzLl9zeW5jVUlQb3NBbGlnbil9LF9zeW5jVUlQb3NBbGlnbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHIpO3RoaXMuX3VpU2V0VmlzaWJsZVBvc0FsaWduKHRoaXMuZ2V0KHMpKSxlJiZ0aGlzLl91aVNldEFsaWduKGUubm9kZSxlLnBvaW50cyl9LGFsaWduOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5zZXQocix7bm9kZTplLHBvaW50czp0fSk6dGhpcy5fc3luY1VJUG9zQWxpZ24oKSx0aGlzfSxjZW50ZXJlZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hbGlnbihlLFtjLkNDLGMuQ0NdKX0sX3NldEFsaWduQ2VudGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlJiZ0aGlzLnNldChyLHtub2RlOmU9PT0hMD9udWxsOmUscG9pbnRzOltjLkNDLGMuQ0NdfSksZX0sX3VpU2V0QWxpZ246ZnVuY3Rpb24odCxyKXtpZighbi5pc0FycmF5KHIpfHxyLmxlbmd0aCE9PTIpe2UuZXJyb3IoImFsaWduOiBJbnZhbGlkIFBvaW50cyBBcmd1bWVudHMiKTtyZXR1cm59dmFyIGk9dGhpcy5fZ2V0UmVnaW9uKHQpLHMsbyx1O2lmKCFpKXJldHVybjtzPXJbMF0sbz1yWzFdO3N3aXRjaChvKXtjYXNlIGMuVEw6dT1baS5sZWZ0LGkudG9wXTticmVhaztjYXNlIGMuVFI6dT1baS5yaWdodCxpLnRvcF07YnJlYWs7Y2FzZSBjLkJMOnU9W2kubGVmdCxpLmJvdHRvbV07YnJlYWs7Y2FzZSBjLkJSOnU9W2kucmlnaHQsaS5ib3R0b21dO2JyZWFrO2Nhc2UgYy5UQzp1PVtpLmxlZnQrTWF0aC5mbG9vcihpLndpZHRoLzIpLGkudG9wXTticmVhaztjYXNlIGMuQkM6dT1baS5sZWZ0K01hdGguZmxvb3IoaS53aWR0aC8yKSxpLmJvdHRvbV07YnJlYWs7Y2FzZSBjLkxDOnU9W2kubGVmdCxpLnRvcCtNYXRoLmZsb29yKGkuaGVpZ2h0LzIpXTticmVhaztjYXNlIGMuUkM6dT1baS5yaWdodCxpLnRvcCtNYXRoLmZsb29yKGkuaGVpZ2h0LzIpXTticmVhaztjYXNlIGMuQ0M6dT1baS5sZWZ0K01hdGguZmxvb3IoaS53aWR0aC8yKSxpLnRvcCtNYXRoLmZsb29yKGkuaGVpZ2h0LzIpXTticmVhaztkZWZhdWx0On11JiZ0aGlzLl9kb0FsaWduKHMsdVswXSx1WzFdKX0sX3VpU2V0VmlzaWJsZVBvc0FsaWduOmZ1bmN0aW9uKGUpe2U/dGhpcy5fYXR0YWNoUG9zQWxpZ25VSUhhbmRsZXMoKTp0aGlzLl9kZXRhY2hQb3NBbGlnblVJSGFuZGxlcygpfSxfYXR0YWNoUG9zQWxpZ25VSUhhbmRsZXM6ZnVuY3Rpb24oKXtpZih0aGlzLl9wb3NBbGlnblVJSGFuZGxlcylyZXR1cm47dmFyIHQ9dGhpcy5nZXQobyksbj1lLmJpbmQodGhpcy5fc3luY1VJUG9zQWxpZ24sdGhpcykscj1bXTtlLkFycmF5LmVhY2godGhpcy5nZXQoaSksZnVuY3Rpb24oaSl7dmFyIHM9aS5ldmVudE5hbWUsbz1lLm9uZShpLm5vZGUpfHx0O3MmJnIucHVzaChvLm9uKHMsbikpfSksdGhpcy5fcG9zQWxpZ25VSUhhbmRsZXM9cn0sX2RldGFjaFBvc0FsaWduVUlIYW5kbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcG9zQWxpZ25VSUhhbmRsZXM7dCYmKChuZXcgZS5FdmVudEhhbmRsZSh0KSkuZGV0YWNoKCksdGhpcy5fcG9zQWxpZ25VSUhhbmRsZXM9bnVsbCl9LF9kb0FsaWduOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl9wb3NOb2RlLGk7c3dpdGNoKGUpe2Nhc2UgYy5UTDppPVt0LG5dO2JyZWFrO2Nhc2UgYy5UUjppPVt0LXIuZ2V0KHUpLG5dO2JyZWFrO2Nhc2UgYy5CTDppPVt0LG4tci5nZXQoYSldO2JyZWFrO2Nhc2UgYy5CUjppPVt0LXIuZ2V0KHUpLG4tci5nZXQoYSldO2JyZWFrO2Nhc2UgYy5UQzppPVt0LXIuZ2V0KHUpLzIsbl07YnJlYWs7Y2FzZSBjLkJDOmk9W3Qtci5nZXQodSkvMixuLXIuZ2V0KGEpXTticmVhaztjYXNlIGMuTEM6aT1bdCxuLXIuZ2V0KGEpLzJdO2JyZWFrO2Nhc2UgYy5SQzppPVt0LXIuZ2V0KHUpLG4tci5nZXQoYSkvMl07YnJlYWs7Y2FzZSBjLkNDOmk9W3Qtci5nZXQodSkvMixuLXIuZ2V0KGEpLzJdO2JyZWFrO2RlZmF1bHQ6fWkmJnRoaXMubW92ZShpKX0sX2dldFJlZ2lvbjpmdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4gdD8odD1lLk5vZGUub25lKHQpLHQmJihuPXQuZ2V0KGYpKSk6bj10aGlzLl9wb3NOb2RlLmdldChsKSxufSxfYWZ0ZXJBbGlnbkNoYW5nZTpmdW5jdGlvbihlKXt2YXIgdD1lLm5ld1ZhbDt0JiZ0aGlzLl91aVNldEFsaWduKHQubm9kZSx0LnBvaW50cyl9LF9hZnRlckFsaWduT25DaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5fZGV0YWNoUG9zQWxpZ25VSUhhbmRsZXMoKSx0aGlzLmdldChzKSYmdGhpcy5fYXR0YWNoUG9zQWxpZ25VSUhhbmRsZXMoKX19LGUuV2lkZ2V0UG9zaXRpb25BbGlnbj1jfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ3aWRnZXQtcG9zaXRpb24iXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgid2lkZ2V0LXN0YWNrIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIE8oZSl7fXZhciBuPWUuTGFuZyxyPWUuVUEsaT1lLk5vZGUscz1lLldpZGdldCxvPSJ6SW5kZXgiLHU9InNoaW0iLGE9InZpc2libGUiLGY9ImJvdW5kaW5nQm94IixsPSJyZW5kZXJVSSIsYz0iYmluZFVJIixoPSJzeW5jVUkiLHA9Im9mZnNldFdpZHRoIixkPSJvZmZzZXRIZWlnaHQiLHY9InBhcmVudE5vZGUiLG09ImZpcnN0Q2hpbGQiLGc9Im93bmVyRG9jdW1lbnQiLHk9IndpZHRoIixiPSJoZWlnaHQiLHc9InB4IixFPSJzaGltZGVmZXJyZWQiLFM9InNoaW1yZXNpemUiLHg9InZpc2libGVDaGFuZ2UiLFQ9IndpZHRoQ2hhbmdlIixOPSJoZWlnaHRDaGFuZ2UiLEM9InNoaW1DaGFuZ2UiLGs9InpJbmRleENoYW5nZSIsTD0iY29udGVudFVwZGF0ZSIsQT0ic3RhY2tlZCI7Ty5BVFRSUz17c2hpbTp7dmFsdWU6ci5pZT09Nn0sekluZGV4Ont2YWx1ZTowLHNldHRlcjoiX3NldFpJbmRleCJ9fSxPLkhUTUxfUEFSU0VSPXt6SW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3BhcnNlWkluZGV4KGUpfX0sTy5TSElNX0NMQVNTX05BTUU9cy5nZXRDbGFzc05hbWUodSksTy5TVEFDS0VEX0NMQVNTX05BTUU9cy5nZXRDbGFzc05hbWUoQSksTy5TSElNX1RFTVBMQVRFPSc8aWZyYW1lIGNsYXNzPSInK08uU0hJTV9DTEFTU19OQU1FKyciIGZyYW1lYm9yZGVyPSIwIiB0aXRsZT0iV2lkZ2V0IFN0YWNraW5nIFNoaW0iIHNyYz0iamF2YXNjcmlwdDpmYWxzZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJwcmVzZW50YXRpb24iPjwvaWZyYW1lPicsTy5wcm90b3R5cGU9e2luaXRpYWxpemVyOmZ1bmN0aW9uKCl7dGhpcy5fc3RhY2tOb2RlPXRoaXMuZ2V0KGYpLHRoaXMuX3N0YWNrSGFuZGxlcz17fSxlLmFmdGVyKHRoaXMuX3JlbmRlclVJU3RhY2ssdGhpcyxsKSxlLmFmdGVyKHRoaXMuX3N5bmNVSVN0YWNrLHRoaXMsaCksZS5hZnRlcih0aGlzLl9iaW5kVUlTdGFjayx0aGlzLGMpfSxfc3luY1VJU3RhY2s6ZnVuY3Rpb24oKXt0aGlzLl91aVNldFNoaW0odGhpcy5nZXQodSkpLHRoaXMuX3VpU2V0WkluZGV4KHRoaXMuZ2V0KG8pKX0sX2JpbmRVSVN0YWNrOmZ1bmN0aW9uKCl7dGhpcy5hZnRlcihDLHRoaXMuX2FmdGVyU2hpbUNoYW5nZSksdGhpcy5hZnRlcihrLHRoaXMuX2FmdGVyWkluZGV4Q2hhbmdlKX0sX3JlbmRlclVJU3RhY2s6ZnVuY3Rpb24oKXt0aGlzLl9zdGFja05vZGUuYWRkQ2xhc3MoTy5TVEFDS0VEX0NMQVNTX05BTUUpfSxfcGFyc2VaSW5kZXg6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIWUuaW5Eb2MoKXx8ZS5nZXRTdHlsZSgicG9zaXRpb24iKT09PSJzdGF0aWMiP3Q9ImF1dG8iOnQ9ZS5nZXRDb21wdXRlZFN0eWxlKCJ6SW5kZXgiKSx0PT09ImF1dG8iP251bGw6dH0sX3NldFpJbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gbi5pc1N0cmluZyhlKSYmKGU9cGFyc2VJbnQoZSwxMCkpLG4uaXNOdW1iZXIoZSl8fChlPTApLGV9LF9hZnRlclNoaW1DaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRTaGltKGUubmV3VmFsKX0sX2FmdGVyWkluZGV4Q2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0WkluZGV4KGUubmV3VmFsKX0sX3VpU2V0WkluZGV4OmZ1bmN0aW9uKGUpe3RoaXMuX3N0YWNrTm9kZS5zZXRTdHlsZShvLGUpfSxfdWlTZXRTaGltOmZ1bmN0aW9uKGUpe2U/KHRoaXMuZ2V0KGEpP3RoaXMuX3JlbmRlclNoaW0oKTp0aGlzLl9yZW5kZXJTaGltRGVmZXJyZWQoKSxyLmllPT02JiZ0aGlzLl9hZGRTaGltUmVzaXplSGFuZGxlcnMoKSk6dGhpcy5fZGVzdHJveVNoaW0oKX0sX3JlbmRlclNoaW1EZWZlcnJlZDpmdW5jdGlvbigpe3RoaXMuX3N0YWNrSGFuZGxlc1tFXT10aGlzLl9zdGFja0hhbmRsZXNbRV18fFtdO3ZhciBlPXRoaXMuX3N0YWNrSGFuZGxlc1tFXSx0PWZ1bmN0aW9uKGUpe2UubmV3VmFsJiZ0aGlzLl9yZW5kZXJTaGltKCl9O2UucHVzaCh0aGlzLm9uKHgsdCkpfSxfYWRkU2hpbVJlc2l6ZUhhbmRsZXJzOmZ1bmN0aW9uKCl7dGhpcy5fc3RhY2tIYW5kbGVzW1NdPXRoaXMuX3N0YWNrSGFuZGxlc1tTXXx8W107dmFyIGU9dGhpcy5zaXplU2hpbSx0PXRoaXMuX3N0YWNrSGFuZGxlc1tTXTt0LnB1c2godGhpcy5hZnRlcih4LGUpKSx0LnB1c2godGhpcy5hZnRlcihULGUpKSx0LnB1c2godGhpcy5hZnRlcihOLGUpKSx0LnB1c2godGhpcy5hZnRlcihMLGUpKX0sX2RldGFjaFN0YWNrSGFuZGxlczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9zdGFja0hhbmRsZXNbZV0sbjtpZih0JiZ0Lmxlbmd0aD4wKXdoaWxlKG49dC5wb3AoKSluLmRldGFjaCgpfSxfcmVuZGVyU2hpbTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3NoaW1Ob2RlLHQ9dGhpcy5fc3RhY2tOb2RlO2V8fChlPXRoaXMuX3NoaW1Ob2RlPXRoaXMuX2dldFNoaW1UZW1wbGF0ZSgpLHQuaW5zZXJ0QmVmb3JlKGUsdC5nZXQobSkpLHRoaXMuX2RldGFjaFN0YWNrSGFuZGxlcyhFKSx0aGlzLnNpemVTaGltKCkpfSxfZGVzdHJveVNoaW06ZnVuY3Rpb24oKXt0aGlzLl9zaGltTm9kZSYmKHRoaXMuX3NoaW1Ob2RlLmdldCh2KS5yZW1vdmVDaGlsZCh0aGlzLl9zaGltTm9kZSksdGhpcy5fc2hpbU5vZGU9bnVsbCx0aGlzLl9kZXRhY2hTdGFja0hhbmRsZXMoRSksdGhpcy5fZGV0YWNoU3RhY2tIYW5kbGVzKFMpKX0sc2l6ZVNoaW06ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9zaGltTm9kZSx0PXRoaXMuX3N0YWNrTm9kZTtlJiZyLmllPT09NiYmdGhpcy5nZXQoYSkmJihlLnNldFN0eWxlKHksdC5nZXQocCkrdyksZS5zZXRTdHlsZShiLHQuZ2V0KGQpK3cpKX0sX2dldFNoaW1UZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiBpLmNyZWF0ZShPLlNISU1fVEVNUExBVEUsdGhpcy5fc3RhY2tOb2RlLmdldChnKSl9fSxlLldpZGdldFN0YWNrPU99LCIzLjE3LjIiLHtyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJ3aWRnZXQiXSxza2lubmFibGU6ITB9KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIndpZGdldC1wb3NpdGlvbi1jb25zdHJhaW4iLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbShlKXt9dmFyIG49ImNvbnN0cmFpbiIscj0iY29uc3RyYWlufHh5Q2hhbmdlIixpPSJjb25zdHJhaW5DaGFuZ2UiLHM9InByZXZlbnRPdmVybGFwIixvPSJhbGlnbiIsdT0iIixhPSJiaW5kVUkiLGY9Inh5IixsPSJ4IixjPSJ5IixoPWUuTm9kZSxwPSJ2aWV3cG9ydFJlZ2lvbiIsZD0icmVnaW9uIix2O20uQVRUUlM9e2NvbnN0cmFpbjp7dmFsdWU6bnVsbCxzZXR0ZXI6Il9zZXRDb25zdHJhaW4ifSxwcmV2ZW50T3ZlcmxhcDp7dmFsdWU6ITF9fSx2PW0uX1BSRVZFTlRfT1ZFUkxBUD17eDp7dGx0cjoxLGJsYnI6MSxicmJsOjEsdHJ0bDoxfSx5Ont0cmJyOjEsdGxibDoxLGJsdGw6MSxicnRyOjF9fSxtLnByb3RvdHlwZT17aW5pdGlhbGl6ZXI6ZnVuY3Rpb24oKXt0aGlzLl9wb3NOb2RlfHxlLmVycm9yKCJXaWRnZXRQb3NpdGlvbiBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgV2lkZ2V0LCBiZWZvcmUgV2lkZ2V0UG9zaXRpb25Db25zdHJhaW4gaXMgYWRkZWQiKSxlLmFmdGVyKHRoaXMuX2JpbmRVSVBvc0NvbnN0cmFpbmVkLHRoaXMsYSl9LGdldENvbnN0cmFpbmVkWFk6ZnVuY3Rpb24oZSx0KXt0PXR8fHRoaXMuZ2V0KG4pO3ZhciByPXRoaXMuX2dldFJlZ2lvbih0PT09ITA/bnVsbDp0KSxpPXRoaXMuX3Bvc05vZGUuZ2V0KGQpO3JldHVyblt0aGlzLl9jb25zdHJhaW4oZVswXSxsLGksciksdGhpcy5fY29uc3RyYWluKGVbMV0sYyxpLHIpXX0sY29uc3RyYWluOmZ1bmN0aW9uKGUsdCl7dmFyIHIsaSxzPXR8fHRoaXMuZ2V0KG4pO3MmJihyPWV8fHRoaXMuZ2V0KGYpLGk9dGhpcy5nZXRDb25zdHJhaW5lZFhZKHIscyksKGlbMF0hPT1yWzBdfHxpWzFdIT09clsxXSkmJnRoaXMuc2V0KGYsaSx7Y29uc3RyYWluZWQ6ITB9KSl9LF9zZXRDb25zdHJhaW46ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0hMD9lOmgub25lKGUpfSxfY29uc3RyYWluOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKHIpe3RoaXMuZ2V0KHMpJiYoZT10aGlzLl9wcmV2ZW50T3ZlcmxhcChlLHQsbixyKSk7dmFyIGk9dD09bCxvPWk/ci53aWR0aDpyLmhlaWdodCx1PWk/bi53aWR0aDpuLmhlaWdodCxhPWk/ci5sZWZ0OnIudG9wLGY9aT9yLnJpZ2h0LXU6ci5ib3R0b20tdTtpZihlPGF8fGU+Zil1PG8/ZTxhP2U9YTplPmYmJihlPWYpOmU9YX1yZXR1cm4gZX0sX3ByZXZlbnRPdmVybGFwOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuZ2V0KG8pLHM9dD09PWwsYSxmLGMsaCxwLGQ7cmV0dXJuIGkmJmkucG9pbnRzJiZ2W3RdW2kucG9pbnRzLmpvaW4odSldJiYoZj10aGlzLl9nZXRSZWdpb24oaS5ub2RlKSxmJiYoYT1zP24ud2lkdGg6bi5oZWlnaHQsYz1zP2YubGVmdDpmLnRvcCxoPXM/Zi5yaWdodDpmLmJvdHRvbSxwPXM/Zi5sZWZ0LXIubGVmdDpmLnRvcC1yLnRvcCxkPXM/ci5yaWdodC1mLnJpZ2h0OnIuYm90dG9tLWYuYm90dG9tKSxlPmM/ZDxhJiZwPmEmJihlPWMtYSk6cDxhJiZkPmEmJihlPWgpKSxlfSxfYmluZFVJUG9zQ29uc3RyYWluZWQ6ZnVuY3Rpb24oKXt0aGlzLmFmdGVyKGksdGhpcy5fYWZ0ZXJDb25zdHJhaW5DaGFuZ2UpLHRoaXMuX2VuYWJsZUNvbnN0cmFpbnRzKHRoaXMuZ2V0KG4pKX0sX2FmdGVyQ29uc3RyYWluQ2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMuX2VuYWJsZUNvbnN0cmFpbnRzKGUubmV3VmFsKX0sX2VuYWJsZUNvbnN0cmFpbnRzOmZ1bmN0aW9uKGUpe2U/KHRoaXMuY29uc3RyYWluKCksdGhpcy5fY3h5SGFuZGxlPXRoaXMuX2N4eUhhbmRsZXx8dGhpcy5vbihyLHRoaXMuX2NvbnN0cmFpbk9uWFlDaGFuZ2UpKTp0aGlzLl9jeHlIYW5kbGUmJih0aGlzLl9jeHlIYW5kbGUuZGV0YWNoKCksdGhpcy5fY3h5SGFuZGxlPW51bGwpfSxfY29uc3RyYWluT25YWUNoYW5nZTpmdW5jdGlvbihlKXtlLmNvbnN0cmFpbmVkfHwoZS5uZXdWYWw9dGhpcy5nZXRDb25zdHJhaW5lZFhZKGUubmV3VmFsKSl9LF9nZXRSZWdpb246ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGU/KGU9aC5vbmUoZSksZSYmKHQ9ZS5nZXQoZCkpKTp0PXRoaXMuX3Bvc05vZGUuZ2V0KHApLHR9fSxlLldpZGdldFBvc2l0aW9uQ29uc3RyYWluPW19LCIzLjE3LjIiLHtyZXF1aXJlczpbIndpZGdldC1wb3NpdGlvbiJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJvdmVybGF5IixmdW5jdGlvbihlLHQpe2UuT3ZlcmxheT1lLkJhc2UuY3JlYXRlKCJvdmVybGF5IixlLldpZGdldCxbZS5XaWRnZXRTdGRNb2QsZS5XaWRnZXRQb3NpdGlvbixlLldpZGdldFN0YWNrLGUuV2lkZ2V0UG9zaXRpb25BbGlnbixlLldpZGdldFBvc2l0aW9uQ29uc3RyYWluXSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbIndpZGdldCIsIndpZGdldC1zdGRtb2QiLCJ3aWRnZXQtcG9zaXRpb24iLCJ3aWRnZXQtcG9zaXRpb24tYWxpZ24iLCJ3aWRnZXQtc3RhY2siLCJ3aWRnZXQtcG9zaXRpb24tY29uc3RyYWluIl0sc2tpbm5hYmxlOiEwfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtYXV0b2hpZGUiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbSh0KXtlLmFmdGVyKHRoaXMuX2JpbmRVSUF1dG9oaWRlLHRoaXMsZiksZS5hZnRlcih0aGlzLl9zeW5jVUlBdXRvaGlkZSx0aGlzLGwpLHRoaXMuZ2V0KGMpJiYodGhpcy5fYmluZFVJQXV0b2hpZGUoKSx0aGlzLl9zeW5jVUlBdXRvaGlkZSgpKX12YXIgbj0id2lkZ2V0QXV0b2hpZGUiLHI9ImF1dG9oaWRlIixpPSJjbGlja291dHNpZGUiLHM9ImZvY3Vzb3V0c2lkZSIsbz0iZG9jdW1lbnQiLHU9ImtleSIsYT0iZXNjIixmPSJiaW5kVUkiLGw9InN5bmNVSSIsYz0icmVuZGVyZWQiLGg9ImJvdW5kaW5nQm94IixwPSJ2aXNpYmxlIixkPSJDaGFuZ2UiLHY9ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZTttLkFUVFJTPXtoaWRlT246e3ZhbGlkYXRvcjplLkxhbmcuaXNBcnJheSx2YWx1ZUZuOmZ1bmN0aW9uKCl7cmV0dXJuW3tub2RlOmUub25lKG8pLGV2ZW50TmFtZTp1LGtleUNvZGU6YX1dfX19LG0ucHJvdG90eXBlPXtfdWlIYW5kbGVzQXV0b2hpZGU6bnVsbCxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fZGV0YWNoVUlIYW5kbGVzQXV0b2hpZGUoKX0sX2JpbmRVSUF1dG9oaWRlOmZ1bmN0aW9uKCl7dGhpcy5hZnRlcihwK2QsdGhpcy5fYWZ0ZXJIb3N0VmlzaWJsZUNoYW5nZUF1dG9oaWRlKSx0aGlzLmFmdGVyKCJoaWRlT25DaGFuZ2UiLHRoaXMuX2FmdGVySGlkZU9uQ2hhbmdlKX0sX3N5bmNVSUF1dG9oaWRlOmZ1bmN0aW9uKCl7dGhpcy5fdWlTZXRIb3N0VmlzaWJsZUF1dG9oaWRlKHRoaXMuZ2V0KHApKX0sX3VpU2V0SG9zdFZpc2libGVBdXRvaGlkZTpmdW5jdGlvbih0KXt0P2UubGF0ZXIoMSx0aGlzLCJfYXR0YWNoVUlIYW5kbGVzQXV0b2hpZGUiKTp0aGlzLl9kZXRhY2hVSUhhbmRsZXNBdXRvaGlkZSgpfSxfYXR0YWNoVUlIYW5kbGVzQXV0b2hpZGU6ZnVuY3Rpb24oKXtpZih0aGlzLl91aUhhbmRsZXNBdXRvaGlkZSlyZXR1cm47dmFyIHQ9dGhpcy5nZXQoaCksbj1lLmJpbmQodGhpcy5oaWRlLHRoaXMpLHI9W10saT10aGlzLHM9dGhpcy5nZXQoImhpZGVPbiIpLG89MCx1PXtub2RlOnVuZGVmaW5lZCxldjp1bmRlZmluZWQsa2V5Q29kZTp1bmRlZmluZWR9O2Zvcig7bzxzLmxlbmd0aDtvKyspdS5ub2RlPXNbb10ubm9kZSx1LmV2PXNbb10uZXZlbnROYW1lLHUua2V5Q29kZT1zW29dLmtleUNvZGUsIXUubm9kZSYmIXUua2V5Q29kZSYmdS5ldj9yLnB1c2godC5vbih1LmV2LG4pKTp1Lm5vZGUmJiF1LmtleUNvZGUmJnUuZXY/ci5wdXNoKHUubm9kZS5vbih1LmV2LG4pKTp1Lm5vZGUmJnUua2V5Q29kZSYmdS5ldiYmci5wdXNoKHUubm9kZS5vbih1LmV2LG4sdS5rZXlDb2RlKSk7dGhpcy5fdWlIYW5kbGVzQXV0b2hpZGU9cn0sX2RldGFjaFVJSGFuZGxlc0F1dG9oaWRlOmZ1bmN0aW9uKCl7ZS5lYWNoKHRoaXMuX3VpSGFuZGxlc0F1dG9oaWRlLGZ1bmN0aW9uKGUpe2UuZGV0YWNoKCl9KSx0aGlzLl91aUhhbmRsZXNBdXRvaGlkZT1udWxsfSxfYWZ0ZXJIb3N0VmlzaWJsZUNoYW5nZUF1dG9oaWRlOmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0SG9zdFZpc2libGVBdXRvaGlkZShlLm5ld1ZhbCl9LF9hZnRlckhpZGVPbkNoYW5nZTpmdW5jdGlvbihlKXt0aGlzLl9kZXRhY2hVSUhhbmRsZXNBdXRvaGlkZSgpLHRoaXMuZ2V0KHApJiZ0aGlzLl9hdHRhY2hVSUhhbmRsZXNBdXRvaGlkZSgpfX0sZS5XaWRnZXRBdXRvaGlkZT1tfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwiZXZlbnQta2V5IiwiZXZlbnQtb3V0c2lkZSIsIndpZGdldCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJidXR0b24tY29yZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBpKGUpe3RoaXMuaW5pdGlhbGl6ZXIoZSl9dmFyIG49ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZSxyPWUuQXR0cmlidXRlQ29yZTtpLnByb3RvdHlwZT17VEVNUExBVEU6IjxidXR0b24vPiIsY29uc3RydWN0b3I6aSxpbml0aWFsaXplcjpmdW5jdGlvbihlKXt0aGlzLl9pbml0Tm9kZShlKSx0aGlzLl9pbml0QXR0cmlidXRlcyhlKSx0aGlzLl9yZW5kZXJVSShlKX0sX2luaXROb2RlOmZ1bmN0aW9uKHQpe3QuaG9zdD90aGlzLl9ob3N0PWUub25lKHQuaG9zdCk6dGhpcy5faG9zdD1lLk5vZGUuY3JlYXRlKHRoaXMuVEVNUExBVEUpfSxfaW5pdEF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSl7ci5jYWxsKHRoaXMsaS5BVFRSUyxlKX0sX3JlbmRlclVJOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXROb2RlKCksdD1lLmdldCgibm9kZU5hbWUiKS50b0xvd2VyQ2FzZSgpO2UuYWRkQ2xhc3MoaS5DTEFTU19OQU1FUy5CVVRUT04pLHQhPT0iYnV0dG9uIiYmdCE9PSJpbnB1dCImJmUuc2V0KCJyb2xlIiwiYnV0dG9uIil9LGVuYWJsZTpmdW5jdGlvbigpe3RoaXMuc2V0KCJkaXNhYmxlZCIsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5zZXQoImRpc2FibGVkIiwhMCl9LGdldE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faG9zdHx8KHRoaXMuX2hvc3Q9dGhpcy5nZXQoImJvdW5kaW5nQm94IikpLHRoaXMuX2hvc3R9LF9nZXRMYWJlbDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Tm9kZSgpLHQ9aS5fZ2V0VGV4dExhYmVsRnJvbU5vZGUoZSk7cmV0dXJuIHR9LF9nZXRMYWJlbEhUTUw6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE5vZGUoKSx0PWkuX2dldEhUTUxGcm9tTm9kZShlKTtyZXR1cm4gdH0sX3NldExhYmVsOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLkVzY2FwZS5odG1sKHQpO3JldHVybighcnx8ci5zcmMhPT0iaW50ZXJuYWwiKSYmdGhpcy5zZXQoImxhYmVsSFRNTCIsaSx7c3JjOiJpbnRlcm5hbCJ9KSxpfSxfc2V0TGFiZWxIVE1MOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmdldE5vZGUoKSxzPWkuX2dldExhYmVsTm9kZUZyb21QYXJlbnQociksbz1yLmdldCgibm9kZU5hbWUiKS50b0xvd2VyQ2FzZSgpO3JldHVybiBvPT09ImlucHV0Ij9zLnNldCgidmFsdWUiLGUpOnMuc2V0SFRNTChlKSwoIW58fG4uc3JjIT09ImludGVybmFsIikmJnRoaXMuc2V0KCJsYWJlbCIsZSx7c3JjOiJpbnRlcm5hbCJ9KSxlfSxfc2V0RGlzYWJsZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXROb2RlKCk7cmV0dXJuIHQuZ2V0RE9NTm9kZSgpLmRpc2FibGVkPWUsdC50b2dnbGVDbGFzcyhpLkNMQVNTX05BTUVTLkRJU0FCTEVELGUpLGV9fSxlLm1peChpLnByb3RvdHlwZSxyLnByb3RvdHlwZSksaS5BVFRSUz17bGFiZWw6e3NldHRlcjoiX3NldExhYmVsIixnZXR0ZXI6Il9nZXRMYWJlbCIsbGF6eUFkZDohMX0sbGFiZWxIVE1MOntzZXR0ZXI6Il9zZXRMYWJlbEhUTUwiLGdldHRlcjoiX2dldExhYmVsSFRNTCIsbGF6eUFkZDohMX0sZGlzYWJsZWQ6e3ZhbHVlOiExLHNldHRlcjoiX3NldERpc2FibGVkIixsYXp5QWRkOiExfX0saS5OQU1FPSJidXR0b24iLGkuQ0xBU1NfTkFNRVM9e0JVVFRPTjpuKCJidXR0b24iKSxESVNBQkxFRDpuKCJidXR0b24iLCJkaXNhYmxlZCIpLFNFTEVDVEVEOm4oImJ1dHRvbiIsInNlbGVjdGVkIiksTEFCRUw6bigiYnV0dG9uIiwibGFiZWwiKX0saS5BUklBX1NUQVRFUz17UFJFU1NFRDoiYXJpYS1wcmVzc2VkIixDSEVDS0VEOiJhcmlhLWNoZWNrZWQifSxpLkFSSUFfUk9MRVM9e0JVVFRPTjoiYnV0dG9uIixDSEVDS0JPWDoiY2hlY2tib3giLFRPR0dMRToidG9nZ2xlIn0saS5fZ2V0TGFiZWxOb2RlRnJvbVBhcmVudD1mdW5jdGlvbihlKXt2YXIgdD1lLm9uZSgiLiIraS5DTEFTU19OQU1FUy5MQUJFTCl8fGU7cmV0dXJuIHR9LGkuX2dldFRleHRMYWJlbEZyb21Ob2RlPWZ1bmN0aW9uKGUpe3ZhciB0PWkuX2dldExhYmVsTm9kZUZyb21QYXJlbnQoZSksbj10LmdldCgibm9kZU5hbWUiKS50b0xvd2VyQ2FzZSgpLHI9dC5nZXQobj09PSJpbnB1dCI/InZhbHVlIjoidGV4dCIpO3JldHVybiByfSxpLl9nZXRIVE1MRnJvbU5vZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5fZ2V0TGFiZWxOb2RlRnJvbVBhcmVudChlKSxuPXQuZ2V0SFRNTCgpO3JldHVybiBufSxpLl9nZXREaXNhYmxlZEZyb21Ob2RlPWZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgiZGlzYWJsZWQiKX0sZS5CdXR0b25Db3JlPWl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImF0dHJpYnV0ZS1jb3JlIiwiY2xhc3NuYW1lbWFuYWdlciIsIm5vZGUtYmFzZSIsImVzY2FwZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJidXR0b24tcGx1Z2luIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtuLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfWUuZXh0ZW5kKG4sZS5CdXR0b25Db3JlLHtfYWZ0ZXJOb2RlR2V0OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3IuQVRUUlMscj1uW3RdJiZuW3RdLmdldHRlciYmdGhpc1tuW3RdLmdldHRlcl07aWYocilyZXR1cm4gbmV3IGUuRG8uQWx0ZXJSZXR1cm4oImdldCAiK3Qsci5jYWxsKHRoaXMpKX0sX2FmdGVyTm9kZVNldDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3IuQVRUUlMscj1uW2VdJiZuW2VdLnNldHRlciYmdGhpc1tuW2VdLnNldHRlcl07ciYmci5jYWxsKHRoaXMsdCl9LF9pbml0Tm9kZTpmdW5jdGlvbih0KXt2YXIgbj10Lmhvc3Q7dGhpcy5faG9zdD1uLGUuRG8uYWZ0ZXIodGhpcy5fYWZ0ZXJOb2RlR2V0LG4sImdldCIsdGhpcyksZS5Eby5hZnRlcih0aGlzLl9hZnRlck5vZGVTZXQsbiwic2V0Iix0aGlzKX0sZGVzdHJveTpmdW5jdGlvbigpe319LHtBVFRSUzplLm1lcmdlKGUuQnV0dG9uQ29yZS5BVFRSUyksTkFNRToiYnV0dG9uUGx1Z2luIixOUzoiYnV0dG9uIn0pLG4uY3JlYXRlTm9kZT1mdW5jdGlvbih0LG4pe3ZhciByO3JldHVybiB0JiYhbiYmIXQubm9kZVR5cGUmJiF0LmdldERPTU5vZGUmJnR5cGVvZiB0IT0ic3RyaW5nIiYmKG49dCx0PW4uc3JjTm9kZSksbj1ufHx7fSxyPW4udGVtcGxhdGV8fGUuUGx1Z2luLkJ1dHRvbi5wcm90b3R5cGUuVEVNUExBVEUsdD10fHxuLnNyY05vZGV8fGUuRE9NLmNyZWF0ZShyKSxlLm9uZSh0KS5wbHVnKGUuUGx1Z2luLkJ1dHRvbixuKX0sZS5uYW1lc3BhY2UoIlBsdWdpbiIpLkJ1dHRvbj1ufSwiMy4xNy4yIix7cmVxdWlyZXM6WyJidXR0b24tY29yZSIsImNzc2J1dHRvbiIsIm5vZGUtcGx1Z2luaG9zdCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtYnV0dG9ucyIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBwKGUpe3JldHVybiEhZS5nZXRET01Ob2RlfWZ1bmN0aW9uIGQoKXt0aGlzLl9idXR0b25zSGFuZGxlcz17fX12YXIgbj1lLkFycmF5LHI9ZS5MYW5nLGk9ZS5PYmplY3Qscz1lLlBsdWdpbi5CdXR0b24sbz1lLldpZGdldCx1PWUuV2lkZ2V0U3RkTW9kLGE9ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZSxmPXIuaXNBcnJheSxsPXIuaXNOdW1iZXIsYz1yLmlzU3RyaW5nLGg9ci5pc1ZhbHVlO2QuQVRUUlM9e2J1dHRvbnM6e2dldHRlcjoiX2dldEJ1dHRvbnMiLHNldHRlcjoiX3NldEJ1dHRvbnMiLHZhbHVlOnt9fSxkZWZhdWx0QnV0dG9uOntyZWFkT25seTohMCx2YWx1ZTpudWxsfX0sZC5DTEFTU19OQU1FUz17YnV0dG9uOmEoImJ1dHRvbiIpLGJ1dHRvbnM6by5nZXRDbGFzc05hbWUoImJ1dHRvbnMiKSxwcmltYXJ5OmEoImJ1dHRvbiIsInByaW1hcnkiKX0sZC5IVE1MX1BBUlNFUj17YnV0dG9uczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcGFyc2VCdXR0b25zKGUpfX0sZC5OT05fQlVUVE9OX05PREVfQ0ZHPVsiYWN0aW9uIiwiY2xhc3NOYW1lcyIsImNvbnRleHQiLCJldmVudHMiLCJpc0RlZmF1bHQiLCJzZWN0aW9uIl0sZC5wcm90b3R5cGU9e0JVVFRPTlM6e30sQlVUVE9OU19URU1QTEFURToiPHNwYW4gLz4iLERFRkFVTFRfQlVUVE9OU19TRUNUSU9OOnUuRk9PVEVSLGluaXRpYWxpemVyOmZ1bmN0aW9uKCl7dGhpcy5fc3RkTW9kTm9kZXx8ZS5lcnJvcigiV2lkZ2V0U3RkTW9kIG11c3QgYmUgYWRkZWQgdG8gYSBXaWRnZXQgYmVmb3JlIFdpZGdldEJ1dHRvbnMuIiksdGhpcy5fbWFwQnV0dG9ucyh0aGlzLmdldCgiYnV0dG9ucyIpKSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5hZnRlcih7YnV0dG9uc0NoYW5nZTplLmJpbmQoIl9hZnRlckJ1dHRvbnNDaGFuZ2UiLHRoaXMpLGRlZmF1bHRCdXR0b25DaGFuZ2U6ZS5iaW5kKCJfYWZ0ZXJEZWZhdWx0QnV0dG9uQ2hhbmdlIix0aGlzKX0pLGUuYWZ0ZXIodGhpcy5fYmluZFVJQnV0dG9ucyx0aGlzLCJiaW5kVUkiKSxlLmFmdGVyKHRoaXMuX3N5bmNVSUJ1dHRvbnMsdGhpcywic3luY1VJIil9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXtpLmVhY2godGhpcy5fYnV0dG9uc0hhbmRsZXMsZnVuY3Rpb24oZSl7ZS5kZXRhY2goKX0pLGRlbGV0ZSB0aGlzLl9idXR0b25zSGFuZGxlcyxkZWxldGUgdGhpcy5fYnV0dG9uc01hcCxkZWxldGUgdGhpcy5fZGVmYXVsdEJ1dHRvbn0sYWRkQnV0dG9uOmZ1bmN0aW9uKGUsdCxyKXt2YXIgaT10aGlzLmdldCgiYnV0dG9ucyIpLHMsbztyZXR1cm4gcChlKXx8KGU9dGhpcy5fbWVyZ2VCdXR0b25Db25maWcoZSksdHx8KHQ9ZS5zZWN0aW9uKSksdHx8KHQ9dGhpcy5ERUZBVUxUX0JVVFRPTlNfU0VDVElPTikscz1pW3RdfHwoaVt0XT1bXSksbChyKXx8KHI9cy5sZW5ndGgpLHMuc3BsaWNlKHIsMCxlKSxvPW4uaW5kZXhPZihzLGUpLHRoaXMuc2V0KCJidXR0b25zIixpLHtidXR0b246ZSxzZWN0aW9uOnQsaW5kZXg6byxzcmM6ImFkZCJ9KSx0aGlzfSxnZXRCdXR0b246ZnVuY3Rpb24oZSx0KXtpZighaChlKSlyZXR1cm47dmFyIG49dGhpcy5fYnV0dG9uc01hcCxyO3JldHVybiB0fHwodD10aGlzLkRFRkFVTFRfQlVUVE9OU19TRUNUSU9OKSxsKGUpPyhyPXRoaXMuZ2V0KCJidXR0b25zIiksclt0XSYmclt0XVtlXSk6YXJndW1lbnRzLmxlbmd0aD4xP25bdCsiOiIrZV06bltlXX0scmVtb3ZlQnV0dG9uOmZ1bmN0aW9uKGUsdCl7aWYoIWgoZSkpcmV0dXJuIHRoaXM7dmFyIHI9dGhpcy5nZXQoImJ1dHRvbnMiKSxzO3JldHVybiBsKGUpPyh0fHwodD10aGlzLkRFRkFVTFRfQlVUVE9OU19TRUNUSU9OKSxzPWUsZT1yW3RdW3NdKTooYyhlKSYmKGU9dGhpcy5nZXRCdXR0b24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxpLnNvbWUocixmdW5jdGlvbihyLGkpe3M9bi5pbmRleE9mKHIsZSk7aWYocz4tMSlyZXR1cm4gdD1pLCEwfSkpLGUmJnM+LTEmJihyW3RdLnNwbGljZShzLDEpLHRoaXMuc2V0KCJidXR0b25zIixyLHtidXR0b246ZSxzZWN0aW9uOnQsaW5kZXg6cyxzcmM6InJlbW92ZSJ9KSksdGhpc30sX2JpbmRVSUJ1dHRvbnM6ZnVuY3Rpb24oKXt2YXIgdD1lLmJpbmQoIl9hZnRlckNvbnRlbnRDaGFuZ2VCdXR0b25zIix0aGlzKTt0aGlzLmFmdGVyKHt2aXNpYmxlQ2hhbmdlOmUuYmluZCgiX2FmdGVyVmlzaWJsZUNoYW5nZUJ1dHRvbnMiLHRoaXMpLGhlYWRlckNvbnRlbnRDaGFuZ2U6dCxib2R5Q29udGVudENoYW5nZTp0LGZvb3RlckNvbnRlbnRDaGFuZ2U6dH0pfSxfY3JlYXRlQnV0dG9uOmZ1bmN0aW9uKHQpe3ZhciByLGksbyx1LGEsZixsLGg7aWYocCh0KSlyZXR1cm4gZS5vbmUodC5nZXRET01Ob2RlKCkpLnBsdWcocyk7cj1lLm1lcmdlKHtjb250ZXh0OnRoaXMsZXZlbnRzOiJjbGljayIsbGFiZWw6dC52YWx1ZX0sdCksaT1lLm1lcmdlKHIpLG89ZC5OT05fQlVUVE9OX05PREVfQ0ZHO2Zvcih1PTAsYT1vLmxlbmd0aDt1PGE7dSs9MSlkZWxldGUgaVtvW3VdXTtyZXR1cm4gdD1zLmNyZWF0ZU5vZGUoaSksbD1yLmNvbnRleHQsZj1yLmFjdGlvbixjKGYpJiYoZj1lLmJpbmQoZixsKSksaD10Lm9uKHIuZXZlbnRzLGYsbCksdGhpcy5fYnV0dG9uc0hhbmRsZXNbZS5zdGFtcCh0LCEwKV09aCx0LnNldERhdGEoIm5hbWUiLHRoaXMuX2dldEJ1dHRvbk5hbWUocikpLHQuc2V0RGF0YSgiZGVmYXVsdCIsdGhpcy5fZ2V0QnV0dG9uRGVmYXVsdChyKSksbi5lYWNoKG4oci5jbGFzc05hbWVzKSx0LmFkZENsYXNzLHQpLHR9LF9nZXRCdXR0b25Db250YWluZXI6ZnVuY3Rpb24odCxuKXt2YXIgcj11LlNFQ1RJT05fQ0xBU1NfTkFNRVNbdF0saT1kLkNMQVNTX05BTUVTLmJ1dHRvbnMscz10aGlzLmdldCgiY29udGVudEJveCIpLG8sYTtyZXR1cm4gbz0iLiIrcisiIC4iK2ksYT1zLm9uZShvKSwhYSYmbiYmKGE9ZS5Ob2RlLmNyZWF0ZSh0aGlzLkJVVFRPTlNfVEVNUExBVEUpLGEuYWRkQ2xhc3MoaSkpLGF9LF9nZXRCdXR0b25EZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PXAoZSk/ZS5nZXREYXRhKCJkZWZhdWx0Iik6ZS5pc0RlZmF1bHQ7cmV0dXJuIGModCk/dC50b0xvd2VyQ2FzZSgpPT09InRydWUiOiEhdH0sX2dldEJ1dHRvbk5hbWU6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHAoZSk/dD1lLmdldERhdGEoIm5hbWUiKXx8ZS5nZXQoIm5hbWUiKTp0PWUmJihlLm5hbWV8fGUudHlwZSksdH0sX2dldEJ1dHRvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGkuZWFjaChlLGZ1bmN0aW9uKGUsbil7dFtuXT1lLmNvbmNhdCgpfSksdH0sX21hcEJ1dHRvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2J1dHRvbnNNYXAscj10aGlzLl9nZXRCdXR0b25OYW1lKGUpLGk9dGhpcy5fZ2V0QnV0dG9uRGVmYXVsdChlKTtyJiYobltyXT1lLG5bdCsiOiIrcl09ZSksaSYmKHRoaXMuX2RlZmF1bHRCdXR0b249ZSl9LF9tYXBCdXR0b25zOmZ1bmN0aW9uKGUpe3RoaXMuX2J1dHRvbnNNYXA9e30sdGhpcy5fZGVmYXVsdEJ1dHRvbj1udWxsLGkuZWFjaChlLGZ1bmN0aW9uKGUsdCl7dmFyIG4scjtmb3Iobj0wLHI9ZS5sZW5ndGg7bjxyO24rPTEpdGhpcy5fbWFwQnV0dG9uKGVbbl0sdCl9LHRoaXMpfSxfbWVyZ2VCdXR0b25Db25maWc6ZnVuY3Rpb24odCl7dmFyIG4scixpLHMsbyx1O3JldHVybiB0PWModCk/e25hbWU6dH06ZS5tZXJnZSh0KSx0LnNyY05vZGUmJihzPXQuc3JjTm9kZSxvPXMuZ2V0KCJ0YWdOYW1lIikudG9Mb3dlckNhc2UoKSx1PXMuZ2V0KG89PT0iaW5wdXQiPyJ2YWx1ZSI6InRleHQiKSxuPXtkaXNhYmxlZDohIXMuZ2V0KCJkaXNhYmxlZCIpLGlzRGVmYXVsdDp0aGlzLl9nZXRCdXR0b25EZWZhdWx0KHMpLG5hbWU6dGhpcy5fZ2V0QnV0dG9uTmFtZShzKX0sdSYmKG4ubGFiZWw9dSksZS5taXgodCxuLCExLG51bGwsMCwhMCkpLGk9dGhpcy5fZ2V0QnV0dG9uTmFtZSh0KSxyPXRoaXMuQlVUVE9OUyYmdGhpcy5CVVRUT05TW2ldLHImJmUubWl4KHQsciwhMSxudWxsLDAsITApLHR9LF9wYXJzZUJ1dHRvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9Ii4iK2QuQ0xBU1NfTkFNRVMuYnV0dG9uLHI9WyJoZWFkZXIiLCJib2R5IiwiZm9vdGVyIl0saT1udWxsO3JldHVybiBuLmVhY2gocixmdW5jdGlvbihlKXt2YXIgbj10aGlzLl9nZXRCdXR0b25Db250YWluZXIoZSkscj1uJiZuLmFsbCh0KSxzO2lmKCFyfHxyLmlzRW1wdHkoKSlyZXR1cm47cz1bXSxyLmVhY2goZnVuY3Rpb24oZSl7cy5wdXNoKHtzcmNOb2RlOmV9KX0pLGl8fChpPXt9KSxpW2VdPXN9LHRoaXMpLGl9LF9zZXRCdXR0b25zOmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoZSxyKXtpZighZihlKSlyZXR1cm47dmFyIGkscyxvLHU7Zm9yKGk9MCxzPWUubGVuZ3RoO2k8cztpKz0xKW89ZVtpXSx1PXIscChvKXx8KG89dGhpcy5fbWVyZ2VCdXR0b25Db25maWcobyksdXx8KHU9by5zZWN0aW9uKSksbz10aGlzLl9jcmVhdGVCdXR0b24obyksdXx8KHU9dCksKG5bdV18fChuW3VdPVtdKSkucHVzaChvKX12YXIgdD10aGlzLkRFRkFVTFRfQlVUVE9OU19TRUNUSU9OLG49e307cmV0dXJuIGYoZSk/ci5jYWxsKHRoaXMsZSk6aS5lYWNoKGUscix0aGlzKSxufSxfc3luY1VJQnV0dG9uczpmdW5jdGlvbigpe3RoaXMuX3VpU2V0QnV0dG9ucyh0aGlzLmdldCgiYnV0dG9ucyIpKSx0aGlzLl91aVNldERlZmF1bHRCdXR0b24odGhpcy5nZXQoImRlZmF1bHRCdXR0b24iKSksdGhpcy5fdWlTZXRWaXNpYmxlQnV0dG9ucyh0aGlzLmdldCgidmlzaWJsZSIpKX0sX3VpSW5zZXJ0QnV0dG9uOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1kLkNMQVNTX05BTUVTLmJ1dHRvbixpPXRoaXMuX2dldEJ1dHRvbkNvbnRhaW5lcih0LCEwKSxzPWkuYWxsKCIuIityKTtpLmluc2VydEJlZm9yZShlLHMuaXRlbShuKSksdGhpcy5zZXRTdGRNb2RDb250ZW50KHQsaSwiYWZ0ZXIiKX0sX3VpUmVtb3ZlQnV0dG9uOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLnN0YW1wKHQsdGhpcykscz10aGlzLl9idXR0b25zSGFuZGxlcyxvPXNbaV0sdSxhO28mJm8uZGV0YWNoKCksZGVsZXRlIHNbaV0sdC5yZW1vdmUoKSxyfHwocj17fSksci5wcmVzZXJ2ZUNvbnRlbnR8fCh1PXRoaXMuX2dldEJ1dHRvbkNvbnRhaW5lcihuKSxhPWQuQ0xBU1NfTkFNRVMuYnV0dG9uLHUmJnUuYWxsKCIuIithKS5pc0VtcHR5KCkmJih1LnJlbW92ZSgpLHRoaXMuX3VwZGF0ZUNvbnRlbnRCdXR0b25zKG4pKSl9LF91aVNldEJ1dHRvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZC5DTEFTU19OQU1FUy5idXR0b24scj1bImhlYWRlciIsImJvZHkiLCJmb290ZXIiXTtuLmVhY2gocixmdW5jdGlvbihuKXt2YXIgcj1lW25dfHxbXSxpPXIubGVuZ3RoLHM9dGhpcy5fZ2V0QnV0dG9uQ29udGFpbmVyKG4saSksbz0hMSx1LGEsZixsO2lmKCFzKXJldHVybjt1PXMuYWxsKCIuIit0KTtmb3IoYT0wO2E8aTthKz0xKWY9clthXSxsPXUuaW5kZXhPZihmKSxsPi0xPyh1LnNwbGljZShsLDEpLGwhPT1hJiYocy5pbnNlcnRCZWZvcmUoZixhKzEpLG89ITApKToocy5hcHBlbmRDaGlsZChmKSxvPSEwKTt1LmVhY2goZnVuY3Rpb24oZSl7dGhpcy5fdWlSZW1vdmVCdXR0b24oZSxuLHtwcmVzZXJ2ZUNvbnRlbnQ6ITB9KSxvPSEwfSx0aGlzKTtpZihpPT09MCl7cy5yZW1vdmUoKSx0aGlzLl91cGRhdGVDb250ZW50QnV0dG9ucyhuKTtyZXR1cm59byYmdGhpcy5zZXRTdGRNb2RDb250ZW50KG4scywiYWZ0ZXIiKX0sdGhpcyl9LF91aVNldERlZmF1bHRCdXR0b246ZnVuY3Rpb24oZSx0KXt2YXIgbj1kLkNMQVNTX05BTUVTLnByaW1hcnk7ZSYmZS5hZGRDbGFzcyhuKSx0JiZ0LnJlbW92ZUNsYXNzKG4pfSxfdWlTZXRWaXNpYmxlQnV0dG9uczpmdW5jdGlvbihlKXtpZighZSlyZXR1cm47dmFyIHQ9dGhpcy5nZXQoImRlZmF1bHRCdXR0b24iKTt0JiZ0LmZvY3VzKCl9LF91bk1hcEJ1dHRvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2J1dHRvbnNNYXAscj10aGlzLl9nZXRCdXR0b25OYW1lKGUpLGk7ciYmKG5bcl09PT1lJiZkZWxldGUgCm5bcl0saT10KyI6IityLG5baV09PT1lJiZkZWxldGUgbltpXSksdGhpcy5fZGVmYXVsdEJ1dHRvbj09PWUmJih0aGlzLl9kZWZhdWx0QnV0dG9uPW51bGwpfSxfdXBkYXRlRGVmYXVsdEJ1dHRvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2RlZmF1bHRCdXR0b247dGhpcy5nZXQoImRlZmF1bHRCdXR0b24iKSE9PWUmJnRoaXMuX3NldCgiZGVmYXVsdEJ1dHRvbiIsZSl9LF91cGRhdGVDb250ZW50QnV0dG9uczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFN0ZE1vZE5vZGUoZSkuZ2V0KCJjaGlsZE5vZGVzIik7dGhpcy5zZXQoZSsiQ29udGVudCIsdC5pc0VtcHR5KCk/bnVsbDp0LHtzcmM6ImJ1dHRvbnMifSl9LF9hZnRlckJ1dHRvbnNDaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5uZXdWYWwsbj1lLnNlY3Rpb24scj1lLmluZGV4LGk9ZS5zcmMscztpZihpPT09ImFkZCIpe3M9dFtuXVtyXSx0aGlzLl9tYXBCdXR0b24ocyxuKSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5fdWlJbnNlcnRCdXR0b24ocyxuLHIpO3JldHVybn1pZihpPT09InJlbW92ZSIpe3M9ZS5idXR0b24sdGhpcy5fdW5NYXBCdXR0b24ocyxuKSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5fdWlSZW1vdmVCdXR0b24ocyxuKTtyZXR1cm59dGhpcy5fbWFwQnV0dG9ucyh0KSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5fdWlTZXRCdXR0b25zKHQpfSxfYWZ0ZXJDb250ZW50Q2hhbmdlQnV0dG9uczpmdW5jdGlvbihlKXt2YXIgdD1lLnNyYyxuPWUuc3RkTW9kUG9zaXRpb24scj0hbnx8bj09PXUuUkVQTEFDRTtyJiZ0IT09ImJ1dHRvbnMiJiZ0IT09by5VSV9TUkMmJnRoaXMuX3VpU2V0QnV0dG9ucyh0aGlzLmdldCgiYnV0dG9ucyIpKX0sX2FmdGVyRGVmYXVsdEJ1dHRvbkNoYW5nZTpmdW5jdGlvbihlKXt0aGlzLl91aVNldERlZmF1bHRCdXR0b24oZS5uZXdWYWwsZS5wcmV2VmFsKX0sX2FmdGVyVmlzaWJsZUNoYW5nZUJ1dHRvbnM6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRWaXNpYmxlQnV0dG9ucyhlLm5ld1ZhbCl9fSxlLldpZGdldEJ1dHRvbnM9ZH0sIjMuMTcuMiIse3JlcXVpcmVzOlsiYnV0dG9uLXBsdWdpbiIsImNzc2J1dHRvbiIsIndpZGdldC1zdGRtb2QiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgid2lkZ2V0LW1vZGFsaXR5IixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGcoZSl7fXZhciBuPSJ3aWRnZXQiLHI9InJlbmRlclVJIixpPSJiaW5kVUkiLHM9InN5bmNVSSIsbz0iYm91bmRpbmdCb3giLHU9InZpc2libGUiLGE9InpJbmRleCIsZj0iQ2hhbmdlIixsPWUuTGFuZy5pc0Jvb2xlYW4sYz1lLkNsYXNzTmFtZU1hbmFnZXIuZ2V0Q2xhc3NOYW1lLGg9Im1hc2tTaG93IixwPSJtYXNrSGlkZSIsZD0iY2xpY2tvdXRzaWRlIix2PSJmb2N1c291dHNpZGUiLG09ZnVuY3Rpb24oKXsKLyohIElTX1BPU0lUSU9OX0ZJWEVEX1NVUFBPUlRFRCAtIEp1cml5IFpheXRzZXYgKGthbmdheCkgLSBodHRwOi8veXVyYS50aGlua3dlYjIuY29tL2NmdC8gKi8KO3ZhciB0PWUuY29uZmlnLmRvYyxuPW51bGwscixpO3JldHVybiB0LmNyZWF0ZUVsZW1lbnQmJihyPXQuY3JlYXRlRWxlbWVudCgiZGl2IiksciYmci5zdHlsZSYmKHIuc3R5bGUucG9zaXRpb249ImZpeGVkIixyLnN0eWxlLnRvcD0iMTBweCIsaT10LmJvZHksaSYmaS5hcHBlbmRDaGlsZCYmaS5yZW1vdmVDaGlsZCYmKGkuYXBwZW5kQ2hpbGQociksbj1yLm9mZnNldFRvcD09PTEwLGkucmVtb3ZlQ2hpbGQocikpKSksbn0oKSx5PSJtb2RhbCIsYj0ibWFzayIsdz17bW9kYWw6YyhuLHkpLG1hc2s6YyhuLGIpfTtnLkFUVFJTPXttYXNrTm9kZTp7Z2V0dGVyOiJfZ2V0TWFza05vZGUiLHJlYWRPbmx5OiEwfSxtb2RhbDp7dmFsdWU6ITEsdmFsaWRhdG9yOmx9LGZvY3VzT246e3ZhbHVlRm46ZnVuY3Rpb24oKXtyZXR1cm5be2V2ZW50TmFtZTpkfSx7ZXZlbnROYW1lOnZ9XX0sdmFsaWRhdG9yOmUuTGFuZy5pc0FycmF5fX0sZy5DTEFTU0VTPXcsZy5fTUFTSz1udWxsLGcuX0dFVF9NQVNLPWZ1bmN0aW9uKCl7dmFyIHQ9Zy5fTUFTSyxuPWUub25lKCJ3aW4iKTtyZXR1cm4gdCYmdC5nZXRET01Ob2RlKCkhPT1udWxsJiZ0LmluRG9jKCk/dDoodD1lLk5vZGUuY3JlYXRlKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKHcubWFzayksZy5fTUFTSz10LG0/dC5zZXRTdHlsZXMoe3Bvc2l0aW9uOiJmaXhlZCIsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsdG9wOiIwIixsZWZ0OiIwIixkaXNwbGF5OiJibG9jayJ9KTp0LnNldFN0eWxlcyh7cG9zaXRpb246ImFic29sdXRlIix3aWR0aDpuLmdldCgid2luV2lkdGgiKSsicHgiLGhlaWdodDpuLmdldCgid2luSGVpZ2h0IikrInB4Iix0b3A6IjAiLGxlZnQ6IjAiLGRpc3BsYXk6ImJsb2NrIn0pLHQpfSxnLlNUQUNLPVtdLGcucHJvdG90eXBlPXtpbml0aWFsaXplcjpmdW5jdGlvbigpe2UuYWZ0ZXIodGhpcy5fcmVuZGVyVUlNb2RhbCx0aGlzLHIpLGUuYWZ0ZXIodGhpcy5fc3luY1VJTW9kYWwsdGhpcyxzKSxlLmFmdGVyKHRoaXMuX2JpbmRVSU1vZGFsLHRoaXMsaSl9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl91aVNldEhvc3RWaXNpYmxlTW9kYWwoITEpfSxfdWlIYW5kbGVzTW9kYWw6bnVsbCxfcmVuZGVyVUlNb2RhbDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KG8pO3RoaXMuX3JlcG9zaXRpb25NYXNrKHRoaXMpLGUuYWRkQ2xhc3Mody5tb2RhbCl9LF9iaW5kVUlNb2RhbDpmdW5jdGlvbigpe3RoaXMuYWZ0ZXIodStmLHRoaXMuX2FmdGVySG9zdFZpc2libGVDaGFuZ2VNb2RhbCksdGhpcy5hZnRlcihhK2YsdGhpcy5fYWZ0ZXJIb3N0WkluZGV4Q2hhbmdlTW9kYWwpLHRoaXMuYWZ0ZXIoImZvY3VzT25DaGFuZ2UiLHRoaXMuX2FmdGVyRm9jdXNPbkNoYW5nZSksKCFtfHxlLlVBLmlvcyYmZS5VQS5pb3M8NXx8ZS5VQS5hbmRyb2lkJiZlLlVBLmFuZHJvaWQ8MykmJmUub25lKCJ3aW4iKS5vbigic2Nyb2xsIix0aGlzLl9yZXN5bmNNYXNrLHRoaXMpfSxfc3luY1VJTW9kYWw6ZnVuY3Rpb24oKXt0aGlzLl91aVNldEhvc3RWaXNpYmxlTW9kYWwodGhpcy5nZXQodSkpfSxfZm9jdXM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldChvKSx0PWUuZ2V0KCJ0YWJJbmRleCIpO2Uuc2V0KCJ0YWJJbmRleCIsdD49MD90OjApLHRoaXMuZm9jdXMoKX0sX2JsdXI6ZnVuY3Rpb24oKXt0aGlzLmJsdXIoKX0sX2dldE1hc2tOb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIGcuX0dFVF9NQVNLKCl9LF91aVNldEhvc3RWaXNpYmxlTW9kYWw6ZnVuY3Rpb24odCl7dmFyIG49Zy5TVEFDSyxyPXRoaXMuZ2V0KCJtYXNrTm9kZSIpLGk9dGhpcy5nZXQoIm1vZGFsIikscyxvO3Q/KGUuQXJyYXkuZWFjaChuLGZ1bmN0aW9uKGUpe2UuX2RldGFjaFVJSGFuZGxlc01vZGFsKCksZS5fYmx1cigpfSksbi51bnNoaWZ0KHRoaXMpLHRoaXMuX3JlcG9zaXRpb25NYXNrKHRoaXMpLHRoaXMuX3VpU2V0SG9zdFpJbmRleE1vZGFsKHRoaXMuZ2V0KGEpKSxpJiYoci5zaG93KCksZS5sYXRlcigxLHRoaXMsIl9hdHRhY2hVSUhhbmRsZXNNb2RhbCIpLHRoaXMuX2ZvY3VzKCkpKToobz1lLkFycmF5LmluZGV4T2Yobix0aGlzKSxvPj0wJiZuLnNwbGljZShvLDEpLHRoaXMuX2RldGFjaFVJSGFuZGxlc01vZGFsKCksdGhpcy5fYmx1cigpLG4ubGVuZ3RoPyhzPW5bMF0sdGhpcy5fcmVwb3NpdGlvbk1hc2socykscy5fdWlTZXRIb3N0WkluZGV4TW9kYWwocy5nZXQoYSkpLHMuZ2V0KCJtb2RhbCIpJiYoZS5sYXRlcigxLHMsIl9hdHRhY2hVSUhhbmRsZXNNb2RhbCIpLHMuX2ZvY3VzKCkpKTpyLmdldFN0eWxlKCJkaXNwbGF5Iik9PT0iYmxvY2siJiZyLmhpZGUoKSl9LF91aVNldEhvc3RaSW5kZXhNb2RhbDpmdW5jdGlvbihlKXt0aGlzLmdldCgibW9kYWwiKSYmdGhpcy5nZXQoIm1hc2tOb2RlIikuc2V0U3R5bGUoYSxlfHwwKX0sX2F0dGFjaFVJSGFuZGxlc01vZGFsOmZ1bmN0aW9uKCl7aWYodGhpcy5fdWlIYW5kbGVzTW9kYWx8fGcuU1RBQ0tbMF0hPT10aGlzKXJldHVybjt2YXIgdD10aGlzLmdldChvKSxuPXRoaXMuZ2V0KCJtYXNrTm9kZSIpLHI9dGhpcy5nZXQoImZvY3VzT24iKSxpPWUuYmluZCh0aGlzLl9mb2N1cyx0aGlzKSxzPVtdLHUsYSxmO2Zvcih1PTAsYT1yLmxlbmd0aDt1PGE7dSsrKWY9e30sZi5ub2RlPXJbdV0ubm9kZSxmLmV2PXJbdV0uZXZlbnROYW1lLGYua2V5Q29kZT1yW3VdLmtleUNvZGUsIWYubm9kZSYmIWYua2V5Q29kZSYmZi5ldj9zLnB1c2godC5vbihmLmV2LGkpKTpmLm5vZGUmJiFmLmtleUNvZGUmJmYuZXY/cy5wdXNoKGYubm9kZS5vbihmLmV2LGkpKTpmLm5vZGUmJmYua2V5Q29kZSYmZi5ldj9zLnB1c2goZi5ub2RlLm9uKGYuZXYsaSxmLmtleUNvZGUpKTplLkxvZygnZm9jdXNPbiBBVFRSIEVycm9yOiBUaGUgZXZlbnQgd2l0aCBuYW1lICInK2YuZXYrJyIgY291bGQgbm90IGJlIGF0dGFjaGVkLicpO218fHMucHVzaChlLm9uZSgid2luIikub24oInNjcm9sbCIsZS5iaW5kKGZ1bmN0aW9uKCl7bi5zZXRTdHlsZSgidG9wIixuLmdldCgiZG9jU2Nyb2xsWSIpKX0sdGhpcykpKSx0aGlzLl91aUhhbmRsZXNNb2RhbD1zfSxfZGV0YWNoVUlIYW5kbGVzTW9kYWw6ZnVuY3Rpb24oKXtlLmVhY2godGhpcy5fdWlIYW5kbGVzTW9kYWwsZnVuY3Rpb24oZSl7ZS5kZXRhY2goKX0pLHRoaXMuX3VpSGFuZGxlc01vZGFsPW51bGx9LF9hZnRlckhvc3RWaXNpYmxlQ2hhbmdlTW9kYWw6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRIb3N0VmlzaWJsZU1vZGFsKGUubmV3VmFsKX0sX2FmdGVySG9zdFpJbmRleENoYW5nZU1vZGFsOmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0SG9zdFpJbmRleE1vZGFsKGUubmV3VmFsKX0saXNOZXN0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT1nLlNUQUNLLmxlbmd0aCx0PWU+MT8hMDohMTtyZXR1cm4gdH0sX3JlcG9zaXRpb25NYXNrOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuZ2V0KCJtb2RhbCIpLHI9dC5nZXQoIm1vZGFsIiksaT10aGlzLmdldCgibWFza05vZGUiKSxzLHU7aWYobiYmIXIpaS5yZW1vdmUoKSx0aGlzLmZpcmUocCk7ZWxzZSBpZighbiYmcnx8biYmcilpLnJlbW92ZSgpLHRoaXMuZmlyZShwKSxzPXQuZ2V0KG8pLHU9cy5nZXQoInBhcmVudE5vZGUiKXx8ZS5vbmUoImJvZHkiKSx1Lmluc2VydChpLHUuZ2V0KCJmaXJzdENoaWxkIikpLHRoaXMuZmlyZShoKX0sX3Jlc3luY01hc2s6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jdXJyZW50VGFyZ2V0LG49dC5nZXQoImRvY1Njcm9sbFgiKSxyPXQuZ2V0KCJkb2NTY3JvbGxZIiksaT10LmdldCgiaW5uZXJXaWR0aCIpfHx0LmdldCgid2luV2lkdGgiKSxzPXQuZ2V0KCJpbm5lckhlaWdodCIpfHx0LmdldCgid2luSGVpZ2h0Iiksbz10aGlzLmdldCgibWFza05vZGUiKTtvLnNldFN0eWxlcyh7dG9wOnIrInB4IixsZWZ0Om4rInB4Iix3aWR0aDppKyJweCIsaGVpZ2h0OnMrInB4In0pfSxfYWZ0ZXJGb2N1c09uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fZGV0YWNoVUlIYW5kbGVzTW9kYWwoKSx0aGlzLmdldCh1KSYmdGhpcy5fYXR0YWNoVUlIYW5kbGVzTW9kYWwoKX19LGUuV2lkZ2V0TW9kYWxpdHk9Z30sIjMuMTcuMiIse3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsImV2ZW50LW91dHNpZGUiLCJ3aWRnZXQiXSxza2lubmFibGU6ITB9KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInBhbmVsIixmdW5jdGlvbihlLHQpe3ZhciBuPWUuQ2xhc3NOYW1lTWFuYWdlci5nZXRDbGFzc05hbWU7ZS5QYW5lbD1lLkJhc2UuY3JlYXRlKCJwYW5lbCIsZS5XaWRnZXQsW2UuV2lkZ2V0UG9zaXRpb24sZS5XaWRnZXRTdGRNb2QsZS5XaWRnZXRBdXRvaGlkZSxlLldpZGdldEJ1dHRvbnMsZS5XaWRnZXRNb2RhbGl0eSxlLldpZGdldFBvc2l0aW9uQWxpZ24sZS5XaWRnZXRQb3NpdGlvbkNvbnN0cmFpbixlLldpZGdldFN0YWNrXSx7QlVUVE9OUzp7Y2xvc2U6e2xhYmVsOiJDbG9zZSIsYWN0aW9uOiJoaWRlIixzZWN0aW9uOiJoZWFkZXIiLHRlbXBsYXRlOic8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgLz4nLGNsYXNzTmFtZXM6bigiYnV0dG9uIiwiY2xvc2UiKX19fSx7QVRUUlM6e2J1dHRvbnM6e3ZhbHVlOlsiY2xvc2UiXX19fSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbIndpZGdldCIsIndpZGdldC1hdXRvaGlkZSIsIndpZGdldC1idXR0b25zIiwid2lkZ2V0LW1vZGFsaXR5Iiwid2lkZ2V0LXBvc2l0aW9uIiwid2lkZ2V0LXBvc2l0aW9uLWFsaWduIiwid2lkZ2V0LXBvc2l0aW9uLWNvbnN0cmFpbiIsIndpZGdldC1zdGFjayIsIndpZGdldC1zdGRtb2QiXSxza2lubmFibGU6ITB9KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInl1aS10aHJvdHRsZSIsZnVuY3Rpb24oZSx0KXsKLyohIEJhc2VkIG9uIHdvcmsgYnkgU2ltb24gV2lsbGlzb246IGh0dHA6Ly9naXN0LmdpdGh1Yi5jb20vMjkyNTYyICovCjtlLnRocm90dGxlPWZ1bmN0aW9uKHQsbil7bj1uP246ZS5jb25maWcudGhyb3R0bGVUaW1lfHwxNTA7aWYobj09PS0xKXJldHVybiBmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt2YXIgcj1lLkxhbmcubm93KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9ZS5MYW5nLm5vdygpO2ktcj5uJiYocj1pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkZC1kZG0tYmFzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbigpe24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O24uTkFNRT0iZGRtIixuLkFUVFJTPXtkcmFnQ3Vyc29yOnt2YWx1ZToibW92ZSJ9LGNsaWNrUGl4ZWxUaHJlc2g6e3ZhbHVlOjN9LGNsaWNrVGltZVRocmVzaDp7dmFsdWU6MWUzfSx0aHJvdHRsZVRpbWU6e3ZhbHVlOi0xfSxkcmFnTW9kZTp7dmFsdWU6InBvaW50IixzZXR0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NldERyYWdNb2RlKGUpLGV9fX0sZS5leHRlbmQobixlLkJhc2Use19jcmVhdGVQRzpmdW5jdGlvbigpe30sX2FjdGl2ZTpudWxsLF9zZXREcmFnTW9kZTpmdW5jdGlvbih0KXt0PT09bnVsbCYmKHQ9ZS5ERC5ERE0uZ2V0KCJkcmFnTW9kZSIpKTtzd2l0Y2godCl7Y2FzZSAxOmNhc2UiaW50ZXJzZWN0IjpyZXR1cm4gMTtjYXNlIDI6Y2FzZSJzdHJpY3QiOnJldHVybiAyO2Nhc2UgMDpjYXNlInBvaW50IjpyZXR1cm4gMH1yZXR1cm4gMH0sQ1NTX1BSRUZJWDplLkNsYXNzTmFtZU1hbmFnZXIuZ2V0Q2xhc3NOYW1lKCJkZCIpLF9hY3RpdmF0ZVRhcmdldHM6ZnVuY3Rpb24oKXt9LF9kcmFnczpbXSxhY3RpdmVEcmFnOiExLF9yZWdEcmFnOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldERyYWcoZS5nZXQoIm5vZGUiKSk/ITE6KHRoaXMuX2FjdGl2ZXx8dGhpcy5fc2V0dXBMaXN0ZW5lcnMoKSx0aGlzLl9kcmFncy5wdXNoKGUpLCEwKX0sX3VucmVnRHJhZzpmdW5jdGlvbih0KXt2YXIgbj1bXTtlLkFycmF5LmVhY2godGhpcy5fZHJhZ3MsZnVuY3Rpb24oZSl7ZSE9PXQmJihuW24ubGVuZ3RoXT1lKX0pLHRoaXMuX2RyYWdzPW59LF9zZXR1cExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX2NyZWF0ZVBHKCksdGhpcy5fYWN0aXZlPSEwO3ZhciB0PWUub25lKGUuY29uZmlnLmRvYyk7dC5vbigibW91c2Vtb3ZlIixlLnRocm90dGxlKGUuYmluZCh0aGlzLl9kb2NNb3ZlLHRoaXMpLHRoaXMuZ2V0KCJ0aHJvdHRsZVRpbWUiKSkpLHQub24oIm1vdXNldXAiLGUuYmluZCh0aGlzLl9lbmQsdGhpcykpfSxfc3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImRkbTpzdGFydCIpLHRoaXMuX3N0YXJ0RHJhZygpfSxfc3RhcnREcmFnOmZ1bmN0aW9uKCl7fSxfZW5kRHJhZzpmdW5jdGlvbigpe30sX2Ryb3BNb3ZlOmZ1bmN0aW9uKCl7fSxfZW5kOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmVEcmFnJiYodGhpcy5fc2hpbW1pbmc9ITEsdGhpcy5fZW5kRHJhZygpLHRoaXMuZmlyZSgiZGRtOmVuZCIpLHRoaXMuYWN0aXZlRHJhZy5lbmQuY2FsbCh0aGlzLmFjdGl2ZURyYWcpLHRoaXMuYWN0aXZlRHJhZz1udWxsKX0sc3RvcERyYWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmVEcmFnJiZ0aGlzLl9lbmQoKSx0aGlzfSxfc2hpbW1pbmc6ITEsX2RvY01vdmU6ZnVuY3Rpb24oZSl7dGhpcy5fc2hpbW1pbmd8fHRoaXMuX21vdmUoZSl9LF9tb3ZlOmZ1bmN0aW9uKGUpe3RoaXMuYWN0aXZlRHJhZyYmKHRoaXMuYWN0aXZlRHJhZy5fbW92ZS5jYWxsKHRoaXMuYWN0aXZlRHJhZyxlKSx0aGlzLl9kcm9wTW92ZSgpKX0sY3NzU2l6ZXN0b09iamVjdDpmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KCIgIik7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6dFsxXT10WzJdPXRbM109dFswXTticmVhaztjYXNlIDI6dFsyXT10WzBdLHRbM109dFsxXTticmVhaztjYXNlIDM6dFszXT10WzFdfXJldHVybnt0b3A6cGFyc2VJbnQodFswXSwxMCkscmlnaHQ6cGFyc2VJbnQodFsxXSwxMCksYm90dG9tOnBhcnNlSW50KHRbMl0sMTApLGxlZnQ6cGFyc2VJbnQodFszXSwxMCl9fSxnZXREcmFnOmZ1bmN0aW9uKHQpe3ZhciBuPSExLHI9ZS5vbmUodCk7cmV0dXJuIHIgaW5zdGFuY2VvZiBlLk5vZGUmJmUuQXJyYXkuZWFjaCh0aGlzLl9kcmFncyxmdW5jdGlvbihlKXtyLmNvbXBhcmVUbyhlLmdldCgibm9kZSIpKSYmKG49ZSl9KSxufSxzd2FwUG9zaXRpb246ZnVuY3Rpb24odCxuKXt0PWUuREQuRERNLmdldE5vZGUodCksbj1lLkRELkRETS5nZXROb2RlKG4pO3ZhciByPXQuZ2V0WFkoKSxpPW4uZ2V0WFkoKTtyZXR1cm4gdC5zZXRYWShpKSxuLnNldFhZKHIpLHR9LGdldE5vZGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBlLk5vZGU/dDoodCYmdC5nZXQ/ZS5XaWRnZXQmJnQgaW5zdGFuY2VvZiBlLldpZGdldD90PXQuZ2V0KCJib3VuZGluZ0JveCIpOnQ9dC5nZXQoIm5vZGUiKTp0PWUub25lKHQpLHQpfSxzd2FwTm9kZTpmdW5jdGlvbih0LG4pe3Q9ZS5ERC5ERE0uZ2V0Tm9kZSh0KSxuPWUuREQuRERNLmdldE5vZGUobik7dmFyIHI9bi5nZXQoInBhcmVudE5vZGUiKSxpPW4uZ2V0KCJuZXh0U2libGluZyIpO3JldHVybiBpPT09dD9yLmluc2VydEJlZm9yZSh0LG4pOm49PT10LmdldCgibmV4dFNpYmxpbmciKT9yLmluc2VydEJlZm9yZShuLHQpOih0LmdldCgicGFyZW50Tm9kZSIpLnJlcGxhY2VDaGlsZChuLHQpLHIuaW5zZXJ0QmVmb3JlKHQsaSkpLHR9fSksZS5uYW1lc3BhY2UoIkREIiksZS5ERC5ERE09bmV3IG59LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUiLCJiYXNlIiwieXVpLXRocm90dGxlIiwiY2xhc3NuYW1lbWFuYWdlciJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkZC1kcmFnIixmdW5jdGlvbihlLHQpe3ZhciBuPWUuREQuRERNLHI9Im5vZGUiLGk9ImRyYWdnaW5nIixzPSJkcmFnTm9kZSIsbz0ib2Zmc2V0SGVpZ2h0Iix1PSJvZmZzZXRXaWR0aCIsYT0iZHJhZzptb3VzZURvd24iLGY9ImRyYWc6YWZ0ZXJNb3VzZURvd24iLGw9ImRyYWc6cmVtb3ZlSGFuZGxlIixjPSJkcmFnOmFkZEhhbmRsZSIsaD0iZHJhZzpyZW1vdmVJbnZhbGlkIixwPSJkcmFnOmFkZEludmFsaWQiLGQ9ImRyYWc6c3RhcnQiLHY9ImRyYWc6ZW5kIixtPSJkcmFnOmRyYWciLGc9ImRyYWc6YWxpZ24iLHk9ZnVuY3Rpb24odCl7dGhpcy5fbGF6eUFkZEF0dHJzPSExLHkuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHI9bi5fcmVnRHJhZyh0aGlzKTtyfHxlLmVycm9yKCJGYWlsZWQgdG8gcmVnaXN0ZXIgbm9kZSwgYWxyZWFkeSBpbiB1c2U6ICIrdC5ub2RlKX07eS5OQU1FPSJkcmFnIix5LlNUQVJUX0VWRU5UPSJtb3VzZWRvd24iLHkuQVRUUlM9e25vZGU6e3NldHRlcjpmdW5jdGlvbih0KXtpZih0aGlzLl9jYW5EcmFnKHQpKXJldHVybiB0O3ZhciBuPWUub25lKHQpO3JldHVybiBufHxlLmVycm9yKCJERC5EcmFnOiBJbnZhbGlkIE5vZGUgR2l2ZW46ICIrdCksbn19LGRyYWdOb2RlOntzZXR0ZXI6ZnVuY3Rpb24odCl7aWYodGhpcy5fY2FuRHJhZyh0KSlyZXR1cm4gdDt2YXIgbj1lLm9uZSh0KTtyZXR1cm4gbnx8ZS5lcnJvcigiREQuRHJhZzogSW52YWxpZCBkcmFnTm9kZSBHaXZlbjogIit0KSxufX0sb2Zmc2V0Tm9kZTp7dmFsdWU6ITB9LHN0YXJ0Q2VudGVyZWQ6e3ZhbHVlOiExfSxjbGlja1BpeGVsVGhyZXNoOnt2YWx1ZTpuLmdldCgiY2xpY2tQaXhlbFRocmVzaCIpfSxjbGlja1RpbWVUaHJlc2g6e3ZhbHVlOm4uZ2V0KCJjbGlja1RpbWVUaHJlc2giKX0sbG9jazp7dmFsdWU6ITEsc2V0dGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlP3RoaXMuZ2V0KHIpLmFkZENsYXNzKG4uQ1NTX1BSRUZJWCsiLWxvY2tlZCIpOnRoaXMuZ2V0KHIpLnJlbW92ZUNsYXNzKG4uQ1NTX1BSRUZJWCsiLWxvY2tlZCIpLGV9fSxkYXRhOnt2YWx1ZTohMX0sbW92ZTp7dmFsdWU6ITB9LHVzZVNoaW06e3ZhbHVlOiEwfSxhY3RpdmVIYW5kbGU6e3ZhbHVlOiExfSxwcmltYXJ5QnV0dG9uT25seTp7dmFsdWU6ITB9LGRyYWdnaW5nOnt2YWx1ZTohMX0scGFyZW50Ont2YWx1ZTohMX0sdGFyZ2V0Ont2YWx1ZTohMSxzZXR0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2hhbmRsZVRhcmdldChlKSxlfX0sZHJhZ01vZGU6e3ZhbHVlOm51bGwsc2V0dGVyOmZ1bmN0aW9uKGUpe3JldHVybiBuLl9zZXREcmFnTW9kZShlKX19LGdyb3Vwczp7dmFsdWU6WyJkZWZhdWx0Il0sZ2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dyb3Vwcz9lLk9iamVjdC5rZXlzKHRoaXMuX2dyb3Vwcyk6KHRoaXMuX2dyb3Vwcz17fSxbXSl9LHNldHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZ3JvdXBzPWUuQXJyYXkuaGFzaCh0KSx0fX0saGFuZGxlczp7dmFsdWU6bnVsbCxzZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/KHRoaXMuX2hhbmRsZXM9e30sZS5BcnJheS5lYWNoKHQsZnVuY3Rpb24odCl7dmFyIG49dDtpZih0IGluc3RhbmNlb2YgZS5Ob2RlfHx0IGluc3RhbmNlb2YgZS5Ob2RlTGlzdCluPXQuX3l1aWQ7dGhpcy5faGFuZGxlc1tuXT10fSx0aGlzKSk6dGhpcy5faGFuZGxlcz1udWxsLHR9fSxidWJibGVzOntzZXR0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkVGFyZ2V0KGUpLGV9fSxoYWx0RG93bjp7dmFsdWU6ITB9fSxlLmV4dGVuZCh5LGUuQmFzZSx7X2NhbkRyYWc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuc2V0WFkmJmUuZ2V0WFkmJmUudGVzdCYmZS5jb250YWlucz8hMDohMX0sX2J1YmJsZVRhcmdldHM6ZS5ERC5ERE0sYWRkVG9Hcm91cDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZ3JvdXBzW2VdPSEwLG4uX2FjdGl2YXRlVGFyZ2V0cygpLHRoaXN9LHJlbW92ZUZyb21Hcm91cDpmdW5jdGlvbihlKXtyZXR1cm4gZGVsZXRlIHRoaXMuX2dyb3Vwc1tlXSxuLl9hY3RpdmF0ZVRhcmdldHMoKSx0aGlzfSx0YXJnZXQ6bnVsbCxfaGFuZGxlVGFyZ2V0OmZ1bmN0aW9uKHQpe2UuREQuRHJvcCYmKHQ9PT0hMT90aGlzLnRhcmdldCYmKG4uX3VucmVnVGFyZ2V0KHRoaXMudGFyZ2V0KSx0aGlzLnRhcmdldD1udWxsKTooZS5MYW5nLmlzT2JqZWN0KHQpfHwodD17fSksdC5idWJibGVUYXJnZXRzPXQuYnViYmxlVGFyZ2V0c3x8dGhpcy5nZXRUYXJnZXRzKCksdC5ub2RlPXRoaXMuZ2V0KHIpLHQuZ3JvdXBzPXQuZ3JvdXBzfHx0aGlzLmdldCgiZ3JvdXBzIiksdGhpcy50YXJnZXQ9bmV3IGUuREQuRHJvcCh0KSkpfSxfZ3JvdXBzOm51bGwsX2NyZWF0ZUV2ZW50czpmdW5jdGlvbigpe3RoaXMucHVibGlzaChhLHtkZWZhdWx0Rm46dGhpcy5fZGVmTW91c2VEb3duRm4scXVldWFibGU6ITEsZW1pdEZhY2FkZTohMCxidWJibGVzOiEwLHByZWZpeDoiZHJhZyJ9KSx0aGlzLnB1Ymxpc2goZyx7ZGVmYXVsdEZuOnRoaXMuX2RlZkFsaWduRm4scXVldWFibGU6ITEsZW1pdEZhY2FkZTohMCxidWJibGVzOiEwLHByZWZpeDoiZHJhZyJ9KSx0aGlzLnB1Ymxpc2gobSx7ZGVmYXVsdEZuOnRoaXMuX2RlZkRyYWdGbixxdWV1YWJsZTohMSxlbWl0RmFjYWRlOiEwLGJ1YmJsZXM6ITAscHJlZml4OiJkcmFnIn0pLHRoaXMucHVibGlzaCh2LHtkZWZhdWx0Rm46dGhpcy5fZGVmRW5kRm4scHJldmVudGVkRm46dGhpcy5fcHJldkVuZEZuLHF1ZXVhYmxlOiExLGVtaXRGYWNhZGU6ITAsYnViYmxlczohMCxwcmVmaXg6ImRyYWcifSk7dmFyIHQ9W2YsbCxjLGgscCxkLCJkcmFnOmRyb3BoaXQiLCJkcmFnOmRyb3BtaXNzIiwiZHJhZzpvdmVyIiwiZHJhZzplbnRlciIsImRyYWc6ZXhpdCJdO2UuQXJyYXkuZWFjaCh0LGZ1bmN0aW9uKGUpe3RoaXMucHVibGlzaChlLHt0eXBlOmUsZW1pdEZhY2FkZTohMCxidWJibGVzOiEwLHByZXZlbnRhYmxlOiExLHF1ZXVhYmxlOiExLHByZWZpeDoiZHJhZyJ9KX0sdGhpcyl9LF9ldl9tZDpudWxsLF9zdGFydFRpbWU6bnVsbCxfZW5kVGltZTpudWxsLF9oYW5kbGVzOm51bGwsX2ludmFsaWRzOm51bGwsX2ludmFsaWRzRGVmYXVsdDp7dGV4dGFyZWE6ITAsaW5wdXQ6ITAsYTohMCxidXR0b246ITAsc2VsZWN0OiEwfSxfZHJhZ1RocmVzaE1ldDpudWxsLF9mcm9tVGltZW91dDpudWxsLF9jbGlja1RpbWVvdXQ6bnVsbCxkZWx0YVhZOm51bGwsc3RhcnRYWTpudWxsLG5vZGVYWTpudWxsLGxhc3RYWTpudWxsLGFjdFhZOm51bGwscmVhbFhZOm51bGwsbW91c2VYWTpudWxsLHJlZ2lvbjpudWxsLF9oYW5kbGVNb3VzZVVwOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJkcmFnOm1vdXNldXAiKSx0aGlzLl9maXhJRU1vdXNlVXAoKSxuLmFjdGl2ZURyYWcmJm4uX2VuZCgpfSxfZml4RHJhZ1N0YXJ0OmZ1bmN0aW9uKGUpe3RoaXMudmFsaWRDbGljayhlKSYmZS5wcmV2ZW50RGVmYXVsdCgpfSxfaWVTZWxlY3RGaXg6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sX2llU2VsZWN0QmFjazpudWxsLF9maXhJRU1vdXNlRG93bjpmdW5jdGlvbigpe2UuVUEuaWUmJih0aGlzLl9pZVNlbGVjdEJhY2s9ZS5jb25maWcuZG9jLmJvZHkub25zZWxlY3RzdGFydCxlLmNvbmZpZy5kb2MuYm9keS5vbnNlbGVjdHN0YXJ0PXRoaXMuX2llU2VsZWN0Rml4KX0sX2ZpeElFTW91c2VVcDpmdW5jdGlvbigpe2UuVUEuaWUmJihlLmNvbmZpZy5kb2MuYm9keS5vbnNlbGVjdHN0YXJ0PXRoaXMuX2llU2VsZWN0QmFjayl9LF9oYW5kbGVNb3VzZURvd25FdmVudDpmdW5jdGlvbihlKXt0aGlzLnZhbGlkQ2xpY2soZSkmJmUucHJldmVudERlZmF1bHQoKSx0aGlzLmZpcmUoYSx7ZXY6ZX0pfSxfZGVmTW91c2VEb3duRm46ZnVuY3Rpb24odCl7dmFyIHI9dC5ldjt0aGlzLl9kcmFnVGhyZXNoTWV0PSExLHRoaXMuX2V2X21kPXI7aWYodGhpcy5nZXQoInByaW1hcnlCdXR0b25Pbmx5IikmJnIuYnV0dG9uPjEpcmV0dXJuITE7dGhpcy52YWxpZENsaWNrKHIpJiYodGhpcy5fZml4SUVNb3VzZURvd24ocikseS5TVEFSVF9FVkVOVC5pbmRleE9mKCJnZXN0dXJlIikhPT0wJiYodGhpcy5nZXQoImhhbHREb3duIik/ci5oYWx0KCk6ci5wcmV2ZW50RGVmYXVsdCgpKSx0aGlzLl9zZXRTdGFydFBvc2l0aW9uKFtyLnBhZ2VYLHIucGFnZVldKSxuLmFjdGl2ZURyYWc9dGhpcyx0aGlzLl9jbGlja1RpbWVvdXQ9ZS5sYXRlcih0aGlzLmdldCgiY2xpY2tUaW1lVGhyZXNoIiksdGhpcyx0aGlzLl90aW1lb3V0Q2hlY2spKSx0aGlzLmZpcmUoZix7ZXY6cn0pfSx2YWxpZENsaWNrOmZ1bmN0aW9uKHQpe3ZhciBuPSExLGk9ITEscz10LnRhcmdldCxvPW51bGwsdT1udWxsLGE9bnVsbCxmPSExO2lmKHRoaXMuX2hhbmRsZXMpZS5PYmplY3QuZWFjaCh0aGlzLl9oYW5kbGVzLGZ1bmN0aW9uKHQscil7dCBpbnN0YW5jZW9mIGUuTm9kZXx8dCBpbnN0YW5jZW9mIGUuTm9kZUxpc3Q/bnx8KGE9dCxhIGluc3RhbmNlb2YgZS5Ob2RlJiYoYT1uZXcgZS5Ob2RlTGlzdCh0Ll9ub2RlKSksYS5lYWNoKGZ1bmN0aW9uKGUpe2UuY29udGFpbnMocykmJihuPSEwKX0pKTplLkxhbmcuaXNTdHJpbmcocikmJnMudGVzdChyKyIsICIrcisiICoiKSYmIW8mJihvPXIsbj0hMCl9KTtlbHNle2k9dGhpcy5nZXQocik7aWYoaS5jb250YWlucyhzKXx8aS5jb21wYXJlVG8ocykpbj0hMH1yZXR1cm4gbiYmdGhpcy5faW52YWxpZHMmJmUuT2JqZWN0LmVhY2godGhpcy5faW52YWxpZHMsZnVuY3Rpb24odCxyKXtlLkxhbmcuaXNTdHJpbmcocikmJnMudGVzdChyKyIsICIrcisiICoiKSYmKG49ITEpfSksbiYmKG8/KHU9dC5jdXJyZW50VGFyZ2V0LmFsbChvKSxmPSExLHUuZWFjaChmdW5jdGlvbihlKXsoZS5jb250YWlucyhzKXx8ZS5jb21wYXJlVG8ocykpJiYhZiYmKGY9ITAsdGhpcy5zZXQoImFjdGl2ZUhhbmRsZSIsZSkpfSx0aGlzKSk6dGhpcy5zZXQoImFjdGl2ZUhhbmRsZSIsdGhpcy5nZXQocikpKSxufSxfc2V0U3RhcnRQb3NpdGlvbjpmdW5jdGlvbihlKXt0aGlzLnN0YXJ0WFk9ZSx0aGlzLm5vZGVYWT10aGlzLmxhc3RYWT10aGlzLnJlYWxYWT10aGlzLmdldChyKS5nZXRYWSgpLHRoaXMuZ2V0KCJvZmZzZXROb2RlIik/dGhpcy5kZWx0YVhZPVt0aGlzLnN0YXJ0WFlbMF0tdGhpcy5ub2RlWFlbMF0sdGhpcy5zdGFydFhZWzFdLXRoaXMubm9kZVhZWzFdXTp0aGlzLmRlbHRhWFk9WzAsMF19LF90aW1lb3V0Q2hlY2s6ZnVuY3Rpb24oKXshdGhpcy5nZXQoImxvY2siKSYmIXRoaXMuX2RyYWdUaHJlc2hNZXQmJnRoaXMuX2V2X21kJiYodGhpcy5fZnJvbVRpbWVvdXQ9dGhpcy5fZHJhZ1RocmVzaE1ldD0hMCx0aGlzLnN0YXJ0KCksdGhpcy5fYWxpZ25Ob2RlKFt0aGlzLl9ldl9tZC5wYWdlWCx0aGlzLl9ldl9tZC5wYWdlWV0sITApKX0scmVtb3ZlSGFuZGxlOmZ1bmN0aW9uKHQpe3ZhciBuPXQ7aWYodCBpbnN0YW5jZW9mIGUuTm9kZXx8dCBpbnN0YW5jZW9mIGUuTm9kZUxpc3Qpbj10Ll95dWlkO3JldHVybiB0aGlzLl9oYW5kbGVzW25dJiYoZGVsZXRlIHRoaXMuX2hhbmRsZXNbbl0sdGhpcy5maXJlKGwse2hhbmRsZTp0fSkpLHRoaXN9LGFkZEhhbmRsZTpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGVzfHwodGhpcy5faGFuZGxlcz17fSk7dmFyIG49dDtpZih0IGluc3RhbmNlb2YgZS5Ob2RlfHx0IGluc3RhbmNlb2YgZS5Ob2RlTGlzdCluPXQuX3l1aWQ7cmV0dXJuIHRoaXMuX2hhbmRsZXNbbl09dCx0aGlzLmZpcmUoYyx7aGFuZGxlOnR9KSx0aGlzfSxyZW1vdmVJbnZhbGlkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9pbnZhbGlkc1tlXSYmKHRoaXMuX2ludmFsaWRzW2VdPW51bGwsZGVsZXRlIHRoaXMuX2ludmFsaWRzW2VdLHRoaXMuZmlyZShoLHtoYW5kbGU6ZX0pKSx0aGlzfSxhZGRJbnZhbGlkOmZ1bmN0aW9uKHQpe3JldHVybiBlLkxhbmcuaXNTdHJpbmcodCkmJih0aGlzLl9pbnZhbGlkc1t0XT0hMCx0aGlzLmZpcmUocCx7aGFuZGxlOnR9KSksdGhpc30saW5pdGlhbGl6ZXI6ZnVuY3Rpb24oCil7dGhpcy5nZXQocikuZGQ9dGhpcztpZighdGhpcy5nZXQocikuZ2V0KCJpZCIpKXt2YXIgdD1lLnN0YW1wKHRoaXMuZ2V0KHIpKTt0aGlzLmdldChyKS5zZXQoImlkIix0KX10aGlzLmFjdFhZPVtdLHRoaXMuX2ludmFsaWRzPWUuY2xvbmUodGhpcy5faW52YWxpZHNEZWZhdWx0LCEwKSx0aGlzLl9jcmVhdGVFdmVudHMoKSx0aGlzLmdldChzKXx8dGhpcy5zZXQocyx0aGlzLmdldChyKSksdGhpcy5vbigiaW5pdGlhbGl6ZWRDaGFuZ2UiLGUuYmluZCh0aGlzLl9wcmVwLHRoaXMpKSx0aGlzLnNldCgiZ3JvdXBzIix0aGlzLmdldCgiZ3JvdXBzIikpfSxfcHJlcDpmdW5jdGlvbigpe3RoaXMuX2RyYWdUaHJlc2hNZXQ9ITE7dmFyIHQ9dGhpcy5nZXQocik7dC5hZGRDbGFzcyhuLkNTU19QUkVGSVgrIi1kcmFnZ2FibGUiKSx0Lm9uKHkuU1RBUlRfRVZFTlQsZS5iaW5kKHRoaXMuX2hhbmRsZU1vdXNlRG93bkV2ZW50LHRoaXMpKSx0Lm9uKCJtb3VzZXVwIixlLmJpbmQodGhpcy5faGFuZGxlTW91c2VVcCx0aGlzKSksdC5vbigiZHJhZ3N0YXJ0IixlLmJpbmQodGhpcy5fZml4RHJhZ1N0YXJ0LHRoaXMpKX0sX3VucHJlcDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHIpO2UucmVtb3ZlQ2xhc3Mobi5DU1NfUFJFRklYKyItZHJhZ2dhYmxlIiksZS5kZXRhY2hBbGwoIm1vdXNldXAiKSxlLmRldGFjaEFsbCgiZHJhZ3N0YXJ0IiksZS5kZXRhY2hBbGwoeS5TVEFSVF9FVkVOVCksdGhpcy5tb3VzZVhZPVtdLHRoaXMuZGVsdGFYWT1bMCwwXSx0aGlzLnN0YXJ0WFk9W10sdGhpcy5ub2RlWFk9W10sdGhpcy5sYXN0WFk9W10sdGhpcy5hY3RYWT1bXSx0aGlzLnJlYWxYWT1bXX0sc3RhcnQ6ZnVuY3Rpb24oKXtpZighdGhpcy5nZXQoImxvY2siKSYmIXRoaXMuZ2V0KGkpKXt2YXIgZT10aGlzLmdldChyKSx0LGEsZjt0aGlzLl9zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCksbi5fc3RhcnQoKSxlLmFkZENsYXNzKG4uQ1NTX1BSRUZJWCsiLWRyYWdnaW5nIiksdGhpcy5maXJlKGQse3BhZ2VYOnRoaXMubm9kZVhZWzBdLHBhZ2VZOnRoaXMubm9kZVhZWzFdLHN0YXJ0VGltZTp0aGlzLl9zdGFydFRpbWV9KSxlPXRoaXMuZ2V0KHMpLGY9dGhpcy5ub2RlWFksdD1lLmdldCh1KSxhPWUuZ2V0KG8pLHRoaXMuZ2V0KCJzdGFydENlbnRlcmVkIikmJnRoaXMuX3NldFN0YXJ0UG9zaXRpb24oW2ZbMF0rdC8yLGZbMV0rYS8yXSksdGhpcy5yZWdpb249ezA6ZlswXSwxOmZbMV0sYXJlYTowLHRvcDpmWzFdLHJpZ2h0OmZbMF0rdCxib3R0b206ZlsxXSthLGxlZnQ6ZlswXX0sdGhpcy5zZXQoaSwhMCl9cmV0dXJuIHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX2NsaWNrVGltZW91dCYmdGhpcy5fY2xpY2tUaW1lb3V0LmNhbmNlbCgpLHRoaXMuX2RyYWdUaHJlc2hNZXQ9dGhpcy5fZnJvbVRpbWVvdXQ9ITEsIXRoaXMuZ2V0KCJsb2NrIikmJnRoaXMuZ2V0KGkpJiZ0aGlzLmZpcmUodix7cGFnZVg6dGhpcy5sYXN0WFlbMF0scGFnZVk6dGhpcy5sYXN0WFlbMV0sc3RhcnRUaW1lOnRoaXMuX3N0YXJ0VGltZSxlbmRUaW1lOnRoaXMuX2VuZFRpbWV9KSx0aGlzLmdldChyKS5yZW1vdmVDbGFzcyhuLkNTU19QUkVGSVgrIi1kcmFnZ2luZyIpLHRoaXMuc2V0KGksITEpLHRoaXMuZGVsdGFYWT1bMCwwXSx0aGlzfSxfZGVmRW5kRm46ZnVuY3Rpb24oKXt0aGlzLl9maXhJRU1vdXNlVXAoKSx0aGlzLl9ldl9tZD1udWxsfSxfcHJldkVuZEZuOmZ1bmN0aW9uKCl7dGhpcy5fZml4SUVNb3VzZVVwKCksdGhpcy5nZXQocykuc2V0WFkodGhpcy5ub2RlWFkpLHRoaXMuX2V2X21kPW51bGwsdGhpcy5yZWdpb249bnVsbH0sX2FsaWduOmZ1bmN0aW9uKGUpe3RoaXMuZmlyZShnLHtwYWdlWDplWzBdLHBhZ2VZOmVbMV19KX0sX2RlZkFsaWduRm46ZnVuY3Rpb24oZSl7dGhpcy5hY3RYWT1bZS5wYWdlWC10aGlzLmRlbHRhWFlbMF0sZS5wYWdlWS10aGlzLmRlbHRhWFlbMV1dfSxfYWxpZ25Ob2RlOmZ1bmN0aW9uKGUsdCl7dGhpcy5fYWxpZ24oZSksdHx8dGhpcy5fbW92ZU5vZGUoKX0sX21vdmVOb2RlOmZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W10scj10aGlzLm5vZGVYWSxpPXRoaXMuYWN0WFk7dFswXT1pWzBdLXRoaXMubGFzdFhZWzBdLHRbMV09aVsxXS10aGlzLmxhc3RYWVsxXSxuWzBdPWlbMF0tdGhpcy5ub2RlWFlbMF0sblsxXT1pWzFdLXRoaXMubm9kZVhZWzFdLHRoaXMucmVnaW9uPXswOmlbMF0sMTppWzFdLGFyZWE6MCx0b3A6aVsxXSxyaWdodDppWzBdK3RoaXMuZ2V0KHMpLmdldCh1KSxib3R0b206aVsxXSt0aGlzLmdldChzKS5nZXQobyksbGVmdDppWzBdfSx0aGlzLmZpcmUobSx7cGFnZVg6aVswXSxwYWdlWTppWzFdLHNjcm9sbDplLGluZm86e3N0YXJ0OnIseHk6aSxkZWx0YTp0LG9mZnNldDpufX0pLHRoaXMubGFzdFhZPWl9LF9kZWZEcmFnRm46ZnVuY3Rpb24odCl7aWYodGhpcy5nZXQoIm1vdmUiKSl7aWYodC5zY3JvbGwmJnQuc2Nyb2xsLm5vZGUpe3ZhciBuPXQuc2Nyb2xsLm5vZGUuZ2V0RE9NTm9kZSgpO249PT1lLmNvbmZpZy53aW4/bi5zY3JvbGxUbyh0LnNjcm9sbC5sZWZ0LHQuc2Nyb2xsLnRvcCk6KHQuc2Nyb2xsLm5vZGUuc2V0KCJzY3JvbGxUb3AiLHQuc2Nyb2xsLnRvcCksdC5zY3JvbGwubm9kZS5zZXQoInNjcm9sbExlZnQiLHQuc2Nyb2xsLmxlZnQpKX10aGlzLmdldChzKS5zZXRYWShbdC5wYWdlWCx0LnBhZ2VZXSksdGhpcy5yZWFsWFk9W3QucGFnZVgsdC5wYWdlWV19fSxfbW92ZTpmdW5jdGlvbihlKXtpZih0aGlzLmdldCgibG9jayIpKXJldHVybiExO3RoaXMubW91c2VYWT1bZS5wYWdlWCxlLnBhZ2VZXTtpZighdGhpcy5fZHJhZ1RocmVzaE1ldCl7dmFyIHQ9TWF0aC5hYnModGhpcy5zdGFydFhZWzBdLWUucGFnZVgpLG49TWF0aC5hYnModGhpcy5zdGFydFhZWzFdLWUucGFnZVkpO2lmKHQ+dGhpcy5nZXQoImNsaWNrUGl4ZWxUaHJlc2giKXx8bj50aGlzLmdldCgiY2xpY2tQaXhlbFRocmVzaCIpKXRoaXMuX2RyYWdUaHJlc2hNZXQ9ITAsdGhpcy5zdGFydCgpLGUmJmUucHJldmVudERlZmF1bHQmJmUucHJldmVudERlZmF1bHQoKSx0aGlzLl9hbGlnbk5vZGUoW2UucGFnZVgsZS5wYWdlWV0pfWVsc2UgdGhpcy5fY2xpY2tUaW1lb3V0JiZ0aGlzLl9jbGlja1RpbWVvdXQuY2FuY2VsKCksdGhpcy5fYWxpZ25Ob2RlKFtlLnBhZ2VYLGUucGFnZVldKX0sc3RvcERyYWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoaSkmJm4uX2VuZCgpLHRoaXN9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl91bnByZXAoKSx0aGlzLnRhcmdldCYmdGhpcy50YXJnZXQuZGVzdHJveSgpLG4uX3VucmVnRHJhZyh0aGlzKX19KSxlLm5hbWVzcGFjZSgiREQiKSxlLkRELkRyYWc9eX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZGQtZGRtLWJhc2UiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiZGQtcGx1Z2luIixmdW5jdGlvbihlLHQpe3ZhciBuPWZ1bmN0aW9uKHQpe2UuV2lkZ2V0JiZ0Lmhvc3QgaW5zdGFuY2VvZiBlLldpZGdldD8odC5ub2RlPXQuaG9zdC5nZXQoImJvdW5kaW5nQm94IiksdC53aWRnZXQ9dC5ob3N0KToodC5ub2RlPXQuaG9zdCx0LndpZGdldD0hMSksbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyx0KX0scj0iZHJhZzpzdGFydCIsaT0iZHJhZzpkcmFnIixzPSJkcmFnOmVuZCI7bi5OQU1FPSJkZC1wbHVnaW4iLG4uTlM9ImRkIixlLmV4dGVuZChuLGUuREQuRHJhZyx7X3dpZGdldEhhbmRsZXM6bnVsbCxfd2lkZ2V0OnVuZGVmaW5lZCxfc3RvcHBlZFBvc2l0aW9uOnVuZGVmaW5lZCxfdXNlc1dpZGdldFBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPSExO3JldHVybiB0JiYobj10Lmhhc0ltcGwmJnQuaGFzSW1wbChlLldpZGdldFBvc2l0aW9uKT8hMDohMSksbn0sX2NoZWNrRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy5fd2lkZ2V0JiYodGhpcy5wcm94eT90aGlzLl93aWRnZXRIYW5kbGVzLmxlbmd0aD4wJiZ0aGlzLl9yZW1vdmVXaWRnZXRMaXN0ZW5lcnMoKTp0aGlzLl93aWRnZXRIYW5kbGVzLmxlbmd0aD09PTAmJnRoaXMuX2F0dGFjaFdpZGdldExpc3RlbmVycygpKX0sX3JlbW92ZVdpZGdldExpc3RlbmVyczpmdW5jdGlvbigpe2UuQXJyYXkuZWFjaCh0aGlzLl93aWRnZXRIYW5kbGVzLGZ1bmN0aW9uKGUpe2UuZGV0YWNoKCl9KSx0aGlzLl93aWRnZXRIYW5kbGVzPVtdfSxfYXR0YWNoV2lkZ2V0TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdXNlc1dpZGdldFBvc2l0aW9uKHRoaXMuX3dpZGdldCkmJih0aGlzLl93aWRnZXRIYW5kbGVzLnB1c2godGhpcy5vbihpLHRoaXMuX3NldFdpZGdldENvb3JkcykpLHRoaXMuX3dpZGdldEhhbmRsZXMucHVzaCh0aGlzLm9uKHMsdGhpcy5fdXBkYXRlU3RvcFBvc2l0aW9uKSkpfSxpbml0aWFsaXplcjpmdW5jdGlvbihlKXt0aGlzLl93aWRnZXRIYW5kbGVzPVtdLHRoaXMuX3dpZGdldD1lLndpZGdldCx0aGlzLm9uKHIsdGhpcy5fY2hlY2tFdmVudHMpLHRoaXMuX2F0dGFjaFdpZGdldExpc3RlbmVycygpfSxfc2V0V2lkZ2V0Q29vcmRzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3N0b3BwZWRQb3NpdGlvbnx8ZS50YXJnZXQubm9kZVhZLG49ZS50YXJnZXQucmVhbFhZLHI9W25bMF0tdFswXSxuWzFdLXRbMV1dO3JbMF0hPT0wJiZyWzFdIT09MD90aGlzLl93aWRnZXQuc2V0KCJ4eSIsbik6clswXT09PTA/dGhpcy5fd2lkZ2V0LnNldCgieSIsblsxXSk6clsxXT09PTAmJnRoaXMuX3dpZGdldC5zZXQoIngiLG5bMF0pfSxfdXBkYXRlU3RvcFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3RoaXMuX3N0b3BwZWRQb3NpdGlvbj1lLnRhcmdldC5yZWFsWFl9fSksZS5uYW1lc3BhY2UoIlBsdWdpbiIpLGUuUGx1Z2luLkRyYWc9bn0sIjMuMTcuMiIse29wdGlvbmFsOlsiZGQtY29uc3RyYWluIiwiZGQtcHJveHkiXSxyZXF1aXJlczpbImRkLWRyYWciXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiY2FjaGUtYmFzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLkxhbmcscj1lLkxhbmcuaXNEYXRlLGk9ZnVuY3Rpb24oKXtpLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtlLm1peChpLHtOQU1FOiJjYWNoZSIsQVRUUlM6e21heDp7dmFsdWU6MCxzZXR0ZXI6Il9zZXRNYXgifSxzaXplOntyZWFkT25seTohMCxnZXR0ZXI6Il9nZXRTaXplIn0sdW5pcXVlS2V5czp7dmFsdWU6ITF9LGV4cGlyZXM6e3ZhbHVlOjAsdmFsaWRhdG9yOmZ1bmN0aW9uKHQpe3JldHVybiBlLkxhbmcuaXNEYXRlKHQpfHxlLkxhbmcuaXNOdW1iZXIodCkmJnQ+PTB9fSxlbnRyaWVzOntyZWFkT25seTohMCxnZXR0ZXI6Il9nZXRFbnRyaWVzIn19fSksZS5leHRlbmQoaSxlLkJhc2Use19lbnRyaWVzOm51bGwsaW5pdGlhbGl6ZXI6ZnVuY3Rpb24oZSl7dGhpcy5wdWJsaXNoKCJhZGQiLHtkZWZhdWx0Rm46dGhpcy5fZGVmQWRkRm59KSx0aGlzLnB1Ymxpc2goImZsdXNoIix7ZGVmYXVsdEZuOnRoaXMuX2RlZkZsdXNoRm59KSx0aGlzLl9lbnRyaWVzPVtdfSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fZW50cmllcz1bXX0sX3NldE1heDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzO2lmKGU+MCl7aWYodCl3aGlsZSh0Lmxlbmd0aD5lKXQuc2hpZnQoKX1lbHNlIGU9MCx0aGlzLl9lbnRyaWVzPVtdO3JldHVybiBlfSxfZ2V0U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbnRyaWVzLmxlbmd0aH0sX2dldEVudHJpZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW50cmllc30sX2RlZkFkZEZuOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2VudHJpZXMscj1lLmVudHJ5LGk9dGhpcy5nZXQoIm1heCIpLHM7dGhpcy5nZXQoInVuaXF1ZUtleXMiKSYmKHM9dGhpcy5fcG9zaXRpb24oZS5lbnRyeS5yZXF1ZXN0KSxuLmlzVmFsdWUocykmJnQuc3BsaWNlKHMsMSkpO3doaWxlKGkmJnQubGVuZ3RoPj1pKXQuc2hpZnQoKTt0W3QubGVuZ3RoXT1yfSxfZGVmRmx1c2hGbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzLHI9ZS5kZXRhaWxzWzBdLGk7ciYmbi5pc1ZhbHVlKHIucmVxdWVzdCk/KGk9dGhpcy5fcG9zaXRpb24oci5yZXF1ZXN0KSxuLmlzVmFsdWUoaSkmJnQuc3BsaWNlKGksMSkpOnRoaXMuX2VudHJpZXM9W119LF9pc01hdGNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIXQuZXhwaXJlc3x8bmV3IERhdGU8dC5leHBpcmVzP2U9PT10LnJlcXVlc3Q6ITF9LF9wb3NpdGlvbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzLG49dC5sZW5ndGgscj1uLTE7aWYodGhpcy5nZXQoIm1heCIpPT09bnVsbHx8dGhpcy5nZXQoIm1heCIpPjApZm9yKDtyPj0wO3ItLSlpZih0aGlzLl9pc01hdGNoKGUsdFtyXSkpcmV0dXJuIHI7cmV0dXJuIG51bGx9LGFkZDpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuZ2V0KCJleHBpcmVzIik7dGhpcy5nZXQoImluaXRpYWxpemVkIikmJih0aGlzLmdldCgibWF4Iik9PT1udWxsfHx0aGlzLmdldCgibWF4Iik+MCkmJihuLmlzVmFsdWUoZSl8fG4uaXNOdWxsKGUpfHxuLmlzVW5kZWZpbmVkKGUpKSYmdGhpcy5maXJlKCJhZGQiLHtlbnRyeTp7cmVxdWVzdDplLHJlc3BvbnNlOnQsY2FjaGVkOm5ldyBEYXRlLGV4cGlyZXM6cihpKT9pOmk/bmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrdGhpcy5nZXQoImV4cGlyZXMiKSk6bnVsbH19KX0sZmx1c2g6ZnVuY3Rpb24oZSl7dGhpcy5maXJlKCJmbHVzaCIse3JlcXVlc3Q6bi5pc1ZhbHVlKGUpP2U6bnVsbH0pfSxyZXRyaWV2ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzLHI9dC5sZW5ndGgsaT1udWxsLHM7aWYocj4wJiYodGhpcy5nZXQoIm1heCIpPT09bnVsbHx8dGhpcy5nZXQoIm1heCIpPjApKXt0aGlzLmZpcmUoInJlcXVlc3QiLHtyZXF1ZXN0OmV9KSxzPXRoaXMuX3Bvc2l0aW9uKGUpO2lmKG4uaXNWYWx1ZShzKSlyZXR1cm4gaT10W3NdLHRoaXMuZmlyZSgicmV0cmlldmUiLHtlbnRyeTppfSksczxyLTEmJih0LnNwbGljZShzLDEpLHRbdC5sZW5ndGhdPWkpLGl9cmV0dXJuIG51bGx9fSksZS5DYWNoZT1pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJiYXNlIl19KTsKdmFyIFkgPSBZVUkoKS51c2UoJyonKTs=
Protocol
HTTP/1.1
Server
194.66.87.68 , United Kingdom, ASN786 (JANET Jisc Services Limited, GB),
Reverse DNS
campusmoodle.rgu.ac.uk
Software
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4 / PHP/7.1.4
Resource Hash
cac10be6dad14d35e38b41c9c1238ced63676b3165529ae4f8aaa2b88577ed67

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sun, 06 Sep 2020 09:31:39 GMT
Content-Encoding
gzip
X-Powered-By
PHP/7.1.4
Content-Disposition
inline; filename="combo"
Connection
Keep-Alive
Content-Length
825
Pragma
Last-Modified
Thu, 03 Jan 2019 16:59:58 GMT
Server
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4
Etag
"ab2b81b7a113e3b94b455930f55f653b5cfcff63"
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
public, max-age=31104000, immutable
Accept-Ranges
none
Keep-Alive
timeout=5, max=100
Expires
Wed, 01 Sep 2021 09:31:39 GMT
ga.js
www.google-analytics.com/
Redirect Chain
  • http://www.google-analytics.com/ga.js
  • https://www.google-analytics.com/ga.js
45 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/ga.js
Requested by
Host: campusmoodle.rgu.cfek.me
URL: http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:800::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 19 Aug 2020 20:46:40 GMT
server
Golfe2
age
1397
date
Sun, 06 Sep 2020 09:08:22 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17168
expires
Sun, 06 Sep 2020 11:08:22 GMT

Redirect headers

Location
https://www.google-analytics.com/ga.js
Non-Authoritative-Reason
HSTS
__utm.gif
www.google-analytics.com/r/
Redirect Chain
  • http://www.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1818937528&utmhn=campusmoodle.rgu.cfek.me&utmcs=UTF-8&utmsr=1600x1200&utmvp=1600x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&ut...
  • https://www.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1818937528&utmhn=campusmoodle.rgu.cfek.me&utmcs=UTF-8&utmsr=1600x1200&utmvp=1600x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&u...
35 B
109 B
Image
General
Full URL
https://www.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1818937528&utmhn=campusmoodle.rgu.cfek.me&utmcs=UTF-8&utmsr=1600x1200&utmvp=1600x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=campusmoodle.rgu.ac.uk%3A%20Log%20in%20to%20the%20site&utmhid=1097526309&utmr=-&utmp=%2Fclient_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res%2F&utmht=1599384699648&utmac=MO-24562687-1&utmcc=__utma%3D178127543.971319287.1599384700.1599384700.1599384700.1%3B%2B__utmz%3D178127543.1599384700.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&utmjid=1904597771&utmredir=1&utmu=qAAAAAAAAAAAAAAAAAAAAAAE~
Requested by
Host: campusmoodle.rgu.cfek.me
URL: http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:800::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 06 Sep 2020 09:31:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

Location
https://www.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1818937528&utmhn=campusmoodle.rgu.cfek.me&utmcs=UTF-8&utmsr=1600x1200&utmvp=1600x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=campusmoodle.rgu.ac.uk%3A%20Log%20in%20to%20the%20site&utmhid=1097526309&utmr=-&utmp=%2Fclient_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res%2F&utmht=1599384699648&utmac=MO-24562687-1&utmcc=__utma%3D178127543.971319287.1599384700.1599384700.1599384700.1%3B%2B__utmz%3D178127543.1599384700.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&utmjid=1904597771&utmredir=1&utmu=qAAAAAAAAAAAAAAAAAAAAAAE~
Non-Authoritative-Reason
HSTS
first.js
campusmoodle.rgu.ac.uk/lib/requirejs.php/1591866501/core/
877 KB
209 KB
Script
General
Full URL
http://campusmoodle.rgu.ac.uk/lib/requirejs.php/1591866501/core/first.js
Requested by
Host: application
URL: data:application/javascript;base64,dmFyIHJlcXVpcmVqcyxyZXF1aXJlLGRlZmluZTshZnVuY3Rpb24oZ2xvYmFsLHNldFRpbWVvdXQpe2Z1bmN0aW9uIGNvbW1lbnRSZXBsYWNlKGUsdCl7cmV0dXJuIHR8fCIifWZ1bmN0aW9uIGlzRnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09PW9zdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBpc0FycmF5KGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1vc3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gZWFjaChlLHQpe2lmKGUpe3ZhciBpO2ZvcihpPTA7aTxlLmxlbmd0aCYmKCFlW2ldfHwhdChlW2ldLGksZSkpO2krPTEpO319ZnVuY3Rpb24gZWFjaFJldmVyc2UoZSx0KXtpZihlKXt2YXIgaTtmb3IoaT1lLmxlbmd0aC0xO2k+LTEmJighZVtpXXx8IXQoZVtpXSxpLGUpKTtpLT0xKTt9fWZ1bmN0aW9uIGhhc1Byb3AoZSx0KXtyZXR1cm4gaGFzT3duLmNhbGwoZSx0KX1mdW5jdGlvbiBnZXRPd24oZSx0KXtyZXR1cm4gaGFzUHJvcChlLHQpJiZlW3RdfWZ1bmN0aW9uIGVhY2hQcm9wKGUsdCl7dmFyIGk7Zm9yKGkgaW4gZSlpZihoYXNQcm9wKGUsaSkmJnQoZVtpXSxpKSlicmVha31mdW5jdGlvbiBtaXhpbihlLHQsaSxyKXtyZXR1cm4gdCYmZWFjaFByb3AodCxmdW5jdGlvbih0LG4peyFpJiZoYXNQcm9wKGUsbil8fCghcnx8Im9iamVjdCIhPXR5cGVvZiB0fHwhdHx8aXNBcnJheSh0KXx8aXNGdW5jdGlvbih0KXx8dCBpbnN0YW5jZW9mIFJlZ0V4cD9lW25dPXQ6KGVbbl18fChlW25dPXt9KSxtaXhpbihlW25dLHQsaSxyKSkpfSksZX1mdW5jdGlvbiBiaW5kKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX1mdW5jdGlvbiBzY3JpcHRzKCl7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKX1mdW5jdGlvbiBkZWZhdWx0T25FcnJvcihlKXt0aHJvdyBlfWZ1bmN0aW9uIGdldEdsb2JhbChlKXtpZighZSlyZXR1cm4gZTt2YXIgdD1nbG9iYWw7cmV0dXJuIGVhY2goZS5zcGxpdCgiLiIpLGZ1bmN0aW9uKGUpe3Q9dFtlXX0pLHR9ZnVuY3Rpb24gbWFrZUVycm9yKGUsdCxpLHIpe3ZhciBuPW5ldyBFcnJvcih0KyJcbmh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjIitlKTtyZXR1cm4gbi5yZXF1aXJlVHlwZT1lLG4ucmVxdWlyZU1vZHVsZXM9cixpJiYobi5vcmlnaW5hbEVycm9yPWkpLG59ZnVuY3Rpb24gbmV3Q29udGV4dChlKXtmdW5jdGlvbiB0KGUpe3ZhciB0LGk7Zm9yKHQ9MDt0PGUubGVuZ3RoO3QrKylpZigiLiI9PT0oaT1lW3RdKSllLnNwbGljZSh0LDEpLHQtPTE7ZWxzZSBpZigiLi4iPT09aSl7aWYoMD09PXR8fDE9PT10JiYiLi4iPT09ZVsyXXx8Ii4uIj09PWVbdC0xXSljb250aW51ZTt0PjAmJihlLnNwbGljZSh0LTEsMiksdC09Mil9fWZ1bmN0aW9uIGkoZSxpLHIpe3ZhciBuLG8sYSxzLHUsYyxkLHAsZixsLGg9aSYmaS5zcGxpdCgiLyIpLG09eS5tYXAsZz1tJiZtWyIqIl07aWYoZSYmKGM9KGU9ZS5zcGxpdCgiLyIpKS5sZW5ndGgtMSx5Lm5vZGVJZENvbXBhdCYmanNTdWZmaXhSZWdFeHAudGVzdChlW2NdKSYmKGVbY109ZVtjXS5yZXBsYWNlKGpzU3VmZml4UmVnRXhwLCIiKSksIi4iPT09ZVswXS5jaGFyQXQoMCkmJmgmJihlPWguc2xpY2UoMCxoLmxlbmd0aC0xKS5jb25jYXQoZSkpLHQoZSksZT1lLmpvaW4oIi8iKSksciYmbSYmKGh8fGcpKXtlOmZvcihhPShvPWUuc3BsaXQoIi8iKSkubGVuZ3RoO2E+MDthLT0xKXtpZih1PW8uc2xpY2UoMCxhKS5qb2luKCIvIiksaClmb3Iocz1oLmxlbmd0aDtzPjA7cy09MSlpZigobj1nZXRPd24obSxoLnNsaWNlKDAscykuam9pbigiLyIpKSkmJihuPWdldE93bihuLHUpKSl7ZD1uLHA9YTticmVhayBlfSFmJiZnJiZnZXRPd24oZyx1KSYmKGY9Z2V0T3duKGcsdSksbD1hKX0hZCYmZiYmKGQ9ZixwPWwpLGQmJihvLnNwbGljZSgwLHAsZCksZT1vLmpvaW4oIi8iKSl9cmV0dXJuIGdldE93bih5LnBrZ3MsZSl8fGV9ZnVuY3Rpb24gcihlKXtpc0Jyb3dzZXImJmVhY2goc2NyaXB0cygpLGZ1bmN0aW9uKHQpe2lmKHQuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVtb2R1bGUiKT09PWUmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVjb250ZXh0Iik9PT1xLmNvbnRleHROYW1lKXJldHVybiB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksITB9KX1mdW5jdGlvbiBuKGUpe3ZhciB0PWdldE93bih5LnBhdGhzLGUpO2lmKHQmJmlzQXJyYXkodCkmJnQubGVuZ3RoPjEpcmV0dXJuIHQuc2hpZnQoKSxxLnJlcXVpcmUudW5kZWYoZSkscS5tYWtlUmVxdWlyZShudWxsLHtza2lwTWFwOiEwfSkoW2VdKSwhMH1mdW5jdGlvbiBvKGUpe3ZhciB0LGk9ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gaT4tMSYmKHQ9ZS5zdWJzdHJpbmcoMCxpKSxlPWUuc3Vic3RyaW5nKGkrMSxlLmxlbmd0aCkpLFt0LGVdfWZ1bmN0aW9uIGEoZSx0LHIsbil7dmFyIGEscyx1LGMsZD1udWxsLHA9dD90Lm5hbWU6bnVsbCxmPWUsbD0hMCxoPSIiO3JldHVybiBlfHwobD0hMSxlPSJfQHIiKyhUKz0xKSksYz1vKGUpLGQ9Y1swXSxlPWNbMV0sZCYmKGQ9aShkLHAsbikscz1nZXRPd24oaixkKSksZSYmKGQ/aD1yP2U6cyYmcy5ub3JtYWxpemU/cy5ub3JtYWxpemUoZSxmdW5jdGlvbihlKXtyZXR1cm4gaShlLHAsbil9KTotMT09PWUuaW5kZXhPZigiISIpP2koZSxwLG4pOmU6KGQ9KGM9byhoPWkoZSxwLG4pKSlbMF0saD1jWzFdLHI9ITAsYT1xLm5hbWVUb1VybChoKSkpLHU9IWR8fHN8fHI/IiI6Il91bm5vcm1hbGl6ZWQiKyhBKz0xKSx7cHJlZml4OmQsbmFtZTpoLHBhcmVudE1hcDp0LHVubm9ybWFsaXplZDohIXUsdXJsOmEsb3JpZ2luYWxOYW1lOmYsaXNEZWZpbmU6bCxpZDooZD9kKyIhIitoOmgpK3V9fWZ1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5pZCxpPWdldE93bihTLHQpO3JldHVybiBpfHwoaT1TW3RdPW5ldyBxLk1vZHVsZShlKSksaX1mdW5jdGlvbiB1KGUsdCxpKXt2YXIgcj1lLmlkLG49Z2V0T3duKFMscik7IWhhc1Byb3AoaixyKXx8biYmIW4uZGVmaW5lRW1pdENvbXBsZXRlPyhuPXMoZSkpLmVycm9yJiYiZXJyb3IiPT09dD9pKG4uZXJyb3IpOm4ub24odCxpKToiZGVmaW5lZCI9PT10JiZpKGpbcl0pfWZ1bmN0aW9uIGMoZSx0KXt2YXIgaT1lLnJlcXVpcmVNb2R1bGVzLHI9ITE7dD90KGUpOihlYWNoKGksZnVuY3Rpb24odCl7dmFyIGk9Z2V0T3duKFMsdCk7aSYmKGkuZXJyb3I9ZSxpLmV2ZW50cy5lcnJvciYmKHI9ITAsaS5lbWl0KCJlcnJvciIsZSkpKX0pLHJ8fHJlcS5vbkVycm9yKGUpKX1mdW5jdGlvbiBkKCl7Z2xvYmFsRGVmUXVldWUubGVuZ3RoJiYoZWFjaChnbG9iYWxEZWZRdWV1ZSxmdW5jdGlvbihlKXt2YXIgdD1lWzBdOyJzdHJpbmciPT10eXBlb2YgdCYmKHEuZGVmUXVldWVNYXBbdF09ITApLE8ucHVzaChlKX0pLGdsb2JhbERlZlF1ZXVlPVtdKX1mdW5jdGlvbiBwKGUpe2RlbGV0ZSBTW2VdLGRlbGV0ZSBrW2VdfWZ1bmN0aW9uIGYoZSx0LGkpe3ZhciByPWUubWFwLmlkO2UuZXJyb3I/ZS5lbWl0KCJlcnJvciIsZS5lcnJvcik6KHRbcl09ITAsZWFjaChlLmRlcE1hcHMsZnVuY3Rpb24ocixuKXt2YXIgbz1yLmlkLGE9Z2V0T3duKFMsbyk7IWF8fGUuZGVwTWF0Y2hlZFtuXXx8aVtvXXx8KGdldE93bih0LG8pPyhlLmRlZmluZURlcChuLGpbb10pLGUuY2hlY2soKSk6ZihhLHQsaSkpfSksaVtyXT0hMCl9ZnVuY3Rpb24gbCgpe3ZhciBlLHQsaT0xZTMqeS53YWl0U2Vjb25kcyxvPWkmJnEuc3RhcnRUaW1lK2k8KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1bXSxzPVtdLHU9ITEsZD0hMDtpZigheCl7aWYoeD0hMCxlYWNoUHJvcChrLGZ1bmN0aW9uKGUpe3ZhciBpPWUubWFwLGM9aS5pZDtpZihlLmVuYWJsZWQmJihpLmlzRGVmaW5lfHxzLnB1c2goZSksIWUuZXJyb3IpKWlmKCFlLmluaXRlZCYmbyluKGMpPyh0PSEwLHU9ITApOihhLnB1c2goYykscihjKSk7ZWxzZSBpZighZS5pbml0ZWQmJmUuZmV0Y2hlZCYmaS5pc0RlZmluZSYmKHU9ITAsIWkucHJlZml4KSlyZXR1cm4gZD0hMX0pLG8mJmEubGVuZ3RoKXJldHVybiBlPW1ha2VFcnJvcigidGltZW91dCIsIkxvYWQgdGltZW91dCBmb3IgbW9kdWxlczogIithLG51bGwsYSksZS5jb250ZXh0TmFtZT1xLmNvbnRleHROYW1lLGMoZSk7ZCYmZWFjaChzLGZ1bmN0aW9uKGUpe2YoZSx7fSx7fSl9KSxvJiYhdHx8IXV8fCFpc0Jyb3dzZXImJiFpc1dlYldvcmtlcnx8d3x8KHc9c2V0VGltZW91dChmdW5jdGlvbigpe3c9MCxsKCl9LDUwKSkseD0hMX19ZnVuY3Rpb24gaChlKXtoYXNQcm9wKGosZVswXSl8fHMoYShlWzBdLG51bGwsITApKS5pbml0KGVbMV0sZVsyXSl9ZnVuY3Rpb24gbShlLHQsaSxyKXtlLmRldGFjaEV2ZW50JiYhaXNPcGVyYT9yJiZlLmRldGFjaEV2ZW50KHIsdCk6ZS5yZW1vdmVFdmVudExpc3RlbmVyKGksdCwhMSl9ZnVuY3Rpb24gZyhlKXt2YXIgdD1lLmN1cnJlbnRUYXJnZXR8fGUuc3JjRWxlbWVudDtyZXR1cm4gbSh0LHEub25TY3JpcHRMb2FkLCJsb2FkIiwib25yZWFkeXN0YXRlY2hhbmdlIiksbSh0LHEub25TY3JpcHRFcnJvciwiZXJyb3IiKSx7bm9kZTp0LGlkOnQmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVtb2R1bGUiKX19ZnVuY3Rpb24gdigpe3ZhciBlO2ZvcihkKCk7Ty5sZW5ndGg7KXtpZihudWxsPT09KGU9Ty5zaGlmdCgpKVswXSlyZXR1cm4gYyhtYWtlRXJyb3IoIm1pc21hdGNoIiwiTWlzbWF0Y2hlZCBhbm9ueW1vdXMgZGVmaW5lKCkgbW9kdWxlOiAiK2VbZS5sZW5ndGgtMV0pKTtoKGUpfXEuZGVmUXVldWVNYXA9e319dmFyIHgsYixxLEUsdyx5PXt3YWl0U2Vjb25kczo3LGJhc2VVcmw6Ii4vIixwYXRoczp7fSxidW5kbGVzOnt9LHBrZ3M6e30sc2hpbTp7fSxjb25maWc6e319LFM9e30saz17fSxNPXt9LE89W10saj17fSxQPXt9LFI9e30sVD0xLEE9MTtyZXR1cm4gRT17cmVxdWlyZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXF1aXJlP2UucmVxdWlyZTplLnJlcXVpcmU9cS5tYWtlUmVxdWlyZShlLm1hcCl9LGV4cG9ydHM6ZnVuY3Rpb24oZSl7aWYoZS51c2luZ0V4cG9ydHM9ITAsZS5tYXAuaXNEZWZpbmUpcmV0dXJuIGUuZXhwb3J0cz9qW2UubWFwLmlkXT1lLmV4cG9ydHM6ZS5leHBvcnRzPWpbZS5tYXAuaWRdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubW9kdWxlP2UubW9kdWxlOmUubW9kdWxlPXtpZDplLm1hcC5pZCx1cmk6ZS5tYXAudXJsLGNvbmZpZzpmdW5jdGlvbigpe3JldHVybiBnZXRPd24oeS5jb25maWcsZS5tYXAuaWQpfHx7fX0sZXhwb3J0czplLmV4cG9ydHN8fChlLmV4cG9ydHM9e30pfX19LGI9ZnVuY3Rpb24oZSl7dGhpcy5ldmVudHM9Z2V0T3duKE0sZS5pZCl8fHt9LHRoaXMubWFwPWUsdGhpcy5zaGltPWdldE93bih5LnNoaW0sZS5pZCksdGhpcy5kZXBFeHBvcnRzPVtdLHRoaXMuZGVwTWFwcz1bXSx0aGlzLmRlcE1hdGNoZWQ9W10sdGhpcy5wbHVnaW5NYXBzPXt9LHRoaXMuZGVwQ291bnQ9MH0sYi5wcm90b3R5cGU9e2luaXQ6ZnVuY3Rpb24oZSx0LGkscil7cj1yfHx7fSx0aGlzLmluaXRlZHx8KHRoaXMuZmFjdG9yeT10LGk/dGhpcy5vbigiZXJyb3IiLGkpOnRoaXMuZXZlbnRzLmVycm9yJiYoaT1iaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5lbWl0KCJlcnJvciIsZSl9KSksdGhpcy5kZXBNYXBzPWUmJmUuc2xpY2UoMCksdGhpcy5lcnJiYWNrPWksdGhpcy5pbml0ZWQ9ITAsdGhpcy5pZ25vcmU9ci5pZ25vcmUsci5lbmFibGVkfHx0aGlzLmVuYWJsZWQ/dGhpcy5lbmFibGUoKTp0aGlzLmNoZWNrKCkpfSxkZWZpbmVEZXA6ZnVuY3Rpb24oZSx0KXt0aGlzLmRlcE1hdGNoZWRbZV18fCh0aGlzLmRlcE1hdGNoZWRbZV09ITAsdGhpcy5kZXBDb3VudC09MSx0aGlzLmRlcEV4cG9ydHNbZV09dCl9LGZldGNoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmV0Y2hlZCl7dGhpcy5mZXRjaGVkPSEwLHEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3ZhciBlPXRoaXMubWFwO2lmKCF0aGlzLnNoaW0pcmV0dXJuIGUucHJlZml4P3RoaXMuY2FsbFBsdWdpbigpOnRoaXMubG9hZCgpO3EubWFrZVJlcXVpcmUodGhpcy5tYXAse2VuYWJsZUJ1aWxkQ2FsbGJhY2s6ITB9KSh0aGlzLnNoaW0uZGVwc3x8W10sYmluZCh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGUucHJlZml4P3RoaXMuY2FsbFBsdWdpbigpOnRoaXMubG9hZCgpfSkpfX0sbG9hZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMubWFwLnVybDtQW2VdfHwoUFtlXT0hMCxxLmxvYWQodGhpcy5tYXAuaWQsZSkpfSxjaGVjazpmdW5jdGlvbigpe2lmKHRoaXMuZW5hYmxlZCYmIXRoaXMuZW5hYmxpbmcpe3ZhciBlLHQsaT10aGlzLm1hcC5pZCxyPXRoaXMuZGVwRXhwb3J0cyxuPXRoaXMuZXhwb3J0cyxvPXRoaXMuZmFjdG9yeTtpZih0aGlzLmluaXRlZCl7aWYodGhpcy5lcnJvcil0aGlzLmVtaXQoImVycm9yIix0aGlzLmVycm9yKTtlbHNlIGlmKCF0aGlzLmRlZmluaW5nKXtpZih0aGlzLmRlZmluaW5nPSEwLHRoaXMuZGVwQ291bnQ8MSYmIXRoaXMuZGVmaW5lZCl7aWYoaXNGdW5jdGlvbihvKSl7aWYodGhpcy5ldmVudHMuZXJyb3ImJnRoaXMubWFwLmlzRGVmaW5lfHxyZXEub25FcnJvciE9PWRlZmF1bHRPbkVycm9yKXRyeXtuPXEuZXhlY0NiKGksbyxyLG4pfWNhdGNoKHQpe2U9dH1lbHNlIG49cS5leGVjQ2IoaSxvLHIsbik7aWYodGhpcy5tYXAuaXNEZWZpbmUmJnZvaWQgMD09PW4mJigodD10aGlzLm1vZHVsZSk/bj10LmV4cG9ydHM6dGhpcy51c2luZ0V4cG9ydHMmJihuPXRoaXMuZXhwb3J0cykpLGUpcmV0dXJuIGUucmVxdWlyZU1hcD10aGlzLm1hcCxlLnJlcXVpcmVNb2R1bGVzPXRoaXMubWFwLmlzRGVmaW5lP1t0aGlzLm1hcC5pZF06bnVsbCxlLnJlcXVpcmVUeXBlPXRoaXMubWFwLmlzRGVmaW5lPyJkZWZpbmUiOiJyZXF1aXJlIixjKHRoaXMuZXJyb3I9ZSl9ZWxzZSBuPW87aWYodGhpcy5leHBvcnRzPW4sdGhpcy5tYXAuaXNEZWZpbmUmJiF0aGlzLmlnbm9yZSYmKGpbaV09bixyZXEub25SZXNvdXJjZUxvYWQpKXt2YXIgYT1bXTtlYWNoKHRoaXMuZGVwTWFwcyxmdW5jdGlvbihlKXthLnB1c2goZS5ub3JtYWxpemVkTWFwfHxlKX0pLHJlcS5vblJlc291cmNlTG9hZChxLHRoaXMubWFwLGEpfXAoaSksdGhpcy5kZWZpbmVkPSEwfXRoaXMuZGVmaW5pbmc9ITEsdGhpcy5kZWZpbmVkJiYhdGhpcy5kZWZpbmVFbWl0dGVkJiYodGhpcy5kZWZpbmVFbWl0dGVkPSEwLHRoaXMuZW1pdCgiZGVmaW5lZCIsdGhpcy5leHBvcnRzKSx0aGlzLmRlZmluZUVtaXRDb21wbGV0ZT0hMCl9fWVsc2UgaGFzUHJvcChxLmRlZlF1ZXVlTWFwLGkpfHx0aGlzLmZldGNoKCl9fSxjYWxsUGx1Z2luOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tYXAsdD1lLmlkLHI9YShlLnByZWZpeCk7dGhpcy5kZXBNYXBzLnB1c2gociksdShyLCJkZWZpbmVkIixiaW5kKHRoaXMsZnVuY3Rpb24ocil7dmFyIG4sbyxkLGY9Z2V0T3duKFIsdGhpcy5tYXAuaWQpLGw9dGhpcy5tYXAubmFtZSxoPXRoaXMubWFwLnBhcmVudE1hcD90aGlzLm1hcC5wYXJlbnRNYXAubmFtZTpudWxsLG09cS5tYWtlUmVxdWlyZShlLnBhcmVudE1hcCx7ZW5hYmxlQnVpbGRDYWxsYmFjazohMH0pO3JldHVybiB0aGlzLm1hcC51bm5vcm1hbGl6ZWQ/KHIubm9ybWFsaXplJiYobD1yLm5vcm1hbGl6ZShsLGZ1bmN0aW9uKGUpe3JldHVybiBpKGUsaCwhMCl9KXx8IiIpLG89YShlLnByZWZpeCsiISIrbCx0aGlzLm1hcC5wYXJlbnRNYXAsITApLHUobywiZGVmaW5lZCIsYmluZCh0aGlzLGZ1bmN0aW9uKGUpe3RoaXMubWFwLm5vcm1hbGl6ZWRNYXA9byx0aGlzLmluaXQoW10sZnVuY3Rpb24oKXtyZXR1cm4gZX0sbnVsbCx7ZW5hYmxlZDohMCxpZ25vcmU6ITB9KX0pKSx2b2lkKChkPWdldE93bihTLG8uaWQpKSYmKHRoaXMuZGVwTWFwcy5wdXNoKG8pLHRoaXMuZXZlbnRzLmVycm9yJiZkLm9uKCJlcnJvciIsYmluZCh0aGlzLGZ1bmN0aW9uKGUpe3RoaXMuZW1pdCgiZXJyb3IiLGUpfSkpLGQuZW5hYmxlKCkpKSk6Zj8odGhpcy5tYXAudXJsPXEubmFtZVRvVXJsKGYpLHZvaWQgdGhpcy5sb2FkKCkpOigobj1iaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5pbml0KFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGV9LG51bGwse2VuYWJsZWQ6ITB9KX0pKS5lcnJvcj1iaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5pbml0ZWQ9ITAsdGhpcy5lcnJvcj1lLGUucmVxdWlyZU1vZHVsZXM9W3RdLGVhY2hQcm9wKFMsZnVuY3Rpb24oZSl7MD09PWUubWFwLmlkLmluZGV4T2YodCsiX3Vubm9ybWFsaXplZCIpJiZwKGUubWFwLmlkKX0pLGMoZSl9KSxuLmZyb21UZXh0PWJpbmQodGhpcyxmdW5jdGlvbihpLHIpe3ZhciBvPWUubmFtZSx1PWEobyksZD11c2VJbnRlcmFjdGl2ZTtyJiYoaT1yKSxkJiYodXNlSW50ZXJhY3RpdmU9ITEpLHModSksaGFzUHJvcCh5LmNvbmZpZyx0KSYmKHkuY29uZmlnW29dPXkuY29uZmlnW3RdKTt0cnl7cmVxLmV4ZWMoaSl9Y2F0Y2goZSl7cmV0dXJuIGMobWFrZUVycm9yKCJmcm9tdGV4dGV2YWwiLCJmcm9tVGV4dCBldmFsIGZvciAiK3QrIiBmYWlsZWQ6ICIrZSxlLFt0XSkpfWQmJih1c2VJbnRlcmFjdGl2ZT0hMCksdGhpcy5kZXBNYXBzLnB1c2godSkscS5jb21wbGV0ZUxvYWQobyksbShbb10sbil9KSx2b2lkIHIubG9hZChlLm5hbWUsbSxuLHkpKX0pKSxxLmVuYWJsZShyLHRoaXMpLHRoaXMucGx1Z2luTWFwc1tyLmlkXT1yfSxlbmFibGU6ZnVuY3Rpb24oKXtrW3RoaXMubWFwLmlkXT10aGlzLHRoaXMuZW5hYmxlZD0hMCx0aGlzLmVuYWJsaW5nPSEwLGVhY2godGhpcy5kZXBNYXBzLGJpbmQodGhpcyxmdW5jdGlvbihlLHQpe3ZhciBpLHIsbjtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKGU9YShlLHRoaXMubWFwLmlzRGVmaW5lP3RoaXMubWFwOnRoaXMubWFwLnBhcmVudE1hcCwhMSwhdGhpcy5za2lwTWFwKSx0aGlzLmRlcE1hcHNbdF09ZSxuPWdldE93bihFLGUuaWQpKXJldHVybiB2b2lkKHRoaXMuZGVwRXhwb3J0c1t0XT1uKHRoaXMpKTt0aGlzLmRlcENvdW50Kz0xLHUoZSwiZGVmaW5lZCIsYmluZCh0aGlzLGZ1bmN0aW9uKGUpe3RoaXMudW5kZWZlZHx8KHRoaXMuZGVmaW5lRGVwKHQsZSksdGhpcy5jaGVjaygpKX0pKSx0aGlzLmVycmJhY2s/dShlLCJlcnJvciIsYmluZCh0aGlzLHRoaXMuZXJyYmFjaykpOnRoaXMuZXZlbnRzLmVycm9yJiZ1KGUsImVycm9yIixiaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5lbWl0KCJlcnJvciIsZSl9KSl9aT1lLmlkLHI9U1tpXSxoYXNQcm9wKEUsaSl8fCFyfHxyLmVuYWJsZWR8fHEuZW5hYmxlKGUsdGhpcyl9KSksZWFjaFByb3AodGhpcy5wbHVnaW5NYXBzLGJpbmQodGhpcyxmdW5jdGlvbihlKXt2YXIgdD1nZXRPd24oUyxlLmlkKTt0JiYhdC5lbmFibGVkJiZxLmVuYWJsZShlLHRoaXMpfSkpLHRoaXMuZW5hYmxpbmc9ITEsdGhpcy5jaGVjaygpfSxvbjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuZXZlbnRzW2VdO2l8fChpPXRoaXMuZXZlbnRzW2VdPVtdKSxpLnB1c2godCl9LGVtaXQ6ZnVuY3Rpb24oZSx0KXtlYWNoKHRoaXMuZXZlbnRzW2VdLGZ1bmN0aW9uKGUpe2UodCl9KSwiZXJyb3IiPT09ZSYmZGVsZXRlIHRoaXMuZXZlbnRzW2VdfX0scT17Y29uZmlnOnksY29udGV4dE5hbWU6ZSxyZWdpc3RyeTpTLGRlZmluZWQ6aix1cmxGZXRjaGVkOlAsZGVmUXVldWU6TyxkZWZRdWV1ZU1hcDp7fSxNb2R1bGU6YixtYWtlTW9kdWxlTWFwOmEsbmV4dFRpY2s6cmVxLm5leHRUaWNrLG9uRXJyb3I6Yyxjb25maWd1cmU6ZnVuY3Rpb24oZSl7aWYoZS5iYXNlVXJsJiYiLyIhPT1lLmJhc2VVcmwuY2hhckF0KGUuYmFzZVVybC5sZW5ndGgtMSkmJihlLmJhc2VVcmwrPSIvIiksInN0cmluZyI9PXR5cGVvZiBlLnVybEFyZ3Mpe3ZhciB0PWUudXJsQXJncztlLnVybEFyZ3M9ZnVuY3Rpb24oZSxpKXtyZXR1cm4oLTE9PT1pLmluZGV4T2YoIj8iKT8iPyI6IiYiKSt0fX12YXIgaT15LnNoaW0scj17cGF0aHM6ITAsYnVuZGxlczohMCxjb25maWc6ITAsbWFwOiEwfTtlYWNoUHJvcChlLGZ1bmN0aW9uKGUsdCl7clt0XT8oeVt0XXx8KHlbdF09e30pLG1peGluKHlbdF0sZSwhMCwhMCkpOnlbdF09ZX0pLGUuYnVuZGxlcyYmZWFjaFByb3AoZS5idW5kbGVzLGZ1bmN0aW9uKGUsdCl7ZWFjaChlLGZ1bmN0aW9uKGUpe2UhPT10JiYoUltlXT10KX0pfSksZS5zaGltJiYoZWFjaFByb3AoZS5zaGltLGZ1bmN0aW9uKGUsdCl7aXNBcnJheShlKSYmKGU9e2RlcHM6ZX0pLCFlLmV4cG9ydHMmJiFlLmluaXR8fGUuZXhwb3J0c0ZufHwoZS5leHBvcnRzRm49cS5tYWtlU2hpbUV4cG9ydHMoZSkpLGlbdF09ZX0pLHkuc2hpbT1pKSxlLnBhY2thZ2VzJiZlYWNoKGUucGFja2FnZXMsZnVuY3Rpb24oZSl7dmFyIHQ7dD0oZT0ic3RyaW5nIj09dHlwZW9mIGU/e25hbWU6ZX06ZSkubmFtZSxlLmxvY2F0aW9uJiYoeS5wYXRoc1t0XT1lLmxvY2F0aW9uKSx5LnBrZ3NbdF09ZS5uYW1lKyIvIisoZS5tYWlufHwibWFpbiIpLnJlcGxhY2UoY3VyckRpclJlZ0V4cCwiIikucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwiIil9KSxlYWNoUHJvcChTLGZ1bmN0aW9uKGUsdCl7ZS5pbml0ZWR8fGUubWFwLnVubm9ybWFsaXplZHx8KGUubWFwPWEodCxudWxsLCEwKSl9KSwoZS5kZXBzfHxlLmNhbGxiYWNrKSYmcS5yZXF1aXJlKGUuZGVwc3x8W10sZS5jYWxsYmFjayl9LG1ha2VTaGltRXhwb3J0czpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gZS5pbml0JiYodD1lLmluaXQuYXBwbHkoZ2xvYmFsLGFyZ3VtZW50cykpLHR8fGUuZXhwb3J0cyYmZ2V0R2xvYmFsKGUuZXhwb3J0cyl9fSxtYWtlUmVxdWlyZTpmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIG8oaSxyLHUpe3ZhciBkLHAsZjtyZXR1cm4gbi5lbmFibGVCdWlsZENhbGxiYWNrJiZyJiZpc0Z1bmN0aW9uKHIpJiYoci5fX3JlcXVpcmVKc0J1aWxkPSEwKSwic3RyaW5nIj09dHlwZW9mIGk/aXNGdW5jdGlvbihyKT9jKG1ha2VFcnJvcigicmVxdWlyZWFyZ3MiLCJJbnZhbGlkIHJlcXVpcmUgY2FsbCIpLHUpOnQmJmhhc1Byb3AoRSxpKT9FW2ldKFNbdC5pZF0pOnJlcS5nZXQ/cmVxLmdldChxLGksdCxvKToocD1hKGksdCwhMSwhMCksZD1wLmlkLGhhc1Byb3AoaixkKT9qW2RdOmMobWFrZUVycm9yKCJub3Rsb2FkZWQiLCdNb2R1bGUgbmFtZSAiJytkKyciIGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0IGZvciBjb250ZXh0OiAnK2UrKHQ/IiI6Ii4gVXNlIHJlcXVpcmUoW10pIikpKSk6KHYoKSxxLm5leHRUaWNrKGZ1bmN0aW9uKCl7digpLChmPXMoYShudWxsLHQpKSkuc2tpcE1hcD1uLnNraXBNYXAsZi5pbml0KGkscix1LHtlbmFibGVkOiEwfSksbCgpfSksbyl9cmV0dXJuIG49bnx8e30sbWl4aW4obyx7aXNCcm93c2VyOmlzQnJvd3Nlcix0b1VybDpmdW5jdGlvbihlKXt2YXIgcixuPWUubGFzdEluZGV4T2YoIi4iKSxvPWUuc3BsaXQoIi8iKVswXSxhPSIuIj09PW98fCIuLiI9PT1vO3JldHVybi0xIT09biYmKCFhfHxuPjEpJiYocj1lLnN1YnN0cmluZyhuLGUubGVuZ3RoKSxlPWUuc3Vic3RyaW5nKDAsbikpLHEubmFtZVRvVXJsKGkoZSx0JiZ0LmlkLCEwKSxyLCEwKX0sZGVmaW5lZDpmdW5jdGlvbihlKXtyZXR1cm4gaGFzUHJvcChqLGEoZSx0LCExLCEwKS5pZCl9LHNwZWNpZmllZDpmdW5jdGlvbihlKXtyZXR1cm4gZT1hKGUsdCwhMSwhMCkuaWQsaGFzUHJvcChqLGUpfHxoYXNQcm9wKFMsZSl9fSksdHx8KG8udW5kZWY9ZnVuY3Rpb24oZSl7ZCgpO3ZhciBpPWEoZSx0LCEwKSxuPWdldE93bihTLGUpO24udW5kZWZlZD0hMCxyKGUpLGRlbGV0ZSBqW2VdLGRlbGV0ZSBQW2kudXJsXSxkZWxldGUgTVtlXSxlYWNoUmV2ZXJzZShPLGZ1bmN0aW9uKHQsaSl7dFswXT09PWUmJk8uc3BsaWNlKGksMSl9KSxkZWxldGUgcS5kZWZRdWV1ZU1hcFtlXSxuJiYobi5ldmVudHMuZGVmaW5lZCYmKE1bZV09bi5ldmVudHMpLHAoZSkpfSksb30sZW5hYmxlOmZ1bmN0aW9uKGUpe2dldE93bihTLGUuaWQpJiZzKGUpLmVuYWJsZSgpfSxjb21wbGV0ZUxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQsaSxyLG89Z2V0T3duKHkuc2hpbSxlKXx8e30sYT1vLmV4cG9ydHM7Zm9yKGQoKTtPLmxlbmd0aDspe2lmKG51bGw9PT0oaT1PLnNoaWZ0KCkpWzBdKXtpZihpWzBdPWUsdClicmVhazt0PSEwfWVsc2UgaVswXT09PWUmJih0PSEwKTtoKGkpfWlmKHEuZGVmUXVldWVNYXA9e30scj1nZXRPd24oUyxlKSwhdCYmIWhhc1Byb3AoaixlKSYmciYmIXIuaW5pdGVkKXtpZighKCF5LmVuZm9yY2VEZWZpbmV8fGEmJmdldEdsb2JhbChhKSkpcmV0dXJuIG4oZSk/dm9pZCAwOmMobWFrZUVycm9yKCJub2RlZmluZSIsIk5vIGRlZmluZSBjYWxsIGZvciAiK2UsbnVsbCxbZV0pKTtoKFtlLG8uZGVwc3x8W10sby5leHBvcnRzRm5dKX1sKCl9LG5hbWVUb1VybDpmdW5jdGlvbihlLHQsaSl7dmFyIHIsbixvLGEscyx1LGMsZD1nZXRPd24oeS5wa2dzLGUpO2lmKGQmJihlPWQpLGM9Z2V0T3duKFIsZSkpcmV0dXJuIHEubmFtZVRvVXJsKGMsdCxpKTtpZihyZXEuanNFeHRSZWdFeHAudGVzdChlKSlzPWUrKHR8fCIiKTtlbHNle2ZvcihyPXkucGF0aHMsbz0obj1lLnNwbGl0KCIvIikpLmxlbmd0aDtvPjA7by09MSlpZihhPW4uc2xpY2UoMCxvKS5qb2luKCIvIiksdT1nZXRPd24ocixhKSl7aXNBcnJheSh1KSYmKHU9dVswXSksbi5zcGxpY2UoMCxvLHUpO2JyZWFrfXM9bi5qb2luKCIvIikscz0oIi8iPT09KHMrPXR8fCgvXmRhdGFcOnxeYmxvYlw6fFw/Ly50ZXN0KHMpfHxpPyIiOiIuanMiKSkuY2hhckF0KDApfHxzLm1hdGNoKC9eW1x3XCtcLlwtXSs6Lyk/IiI6eS5iYXNlVXJsKStzfXJldHVybiB5LnVybEFyZ3MmJiEvXmJsb2JcOi8udGVzdChzKT9zK3kudXJsQXJncyhlLHMpOnN9LGxvYWQ6ZnVuY3Rpb24oZSx0KXtyZXEubG9hZChxLGUsdCl9LGV4ZWNDYjpmdW5jdGlvbihlLHQsaSxyKXtyZXR1cm4gdC5hcHBseShyLGkpfSxvblNjcmlwdExvYWQ6ZnVuY3Rpb24oZSl7aWYoImxvYWQiPT09ZS50eXBlfHxyZWFkeVJlZ0V4cC50ZXN0KChlLmN1cnJlbnRUYXJnZXR8fGUuc3JjRWxlbWVudCkucmVhZHlTdGF0ZSkpe2ludGVyYWN0aXZlU2NyaXB0PW51bGw7dmFyIHQ9ZyhlKTtxLmNvbXBsZXRlTG9hZCh0LmlkKX19LG9uU2NyaXB0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQ9ZyhlKTtpZighbih0LmlkKSl7dmFyIGk9W107cmV0dXJuIGVhY2hQcm9wKFMsZnVuY3Rpb24oZSxyKXswIT09ci5pbmRleE9mKCJfQHIiKSYmZWFjaChlLmRlcE1hcHMsZnVuY3Rpb24oZSl7aWYoZS5pZD09PXQuaWQpcmV0dXJuIGkucHVzaChyKSwhMH0pfSksYyhtYWtlRXJyb3IoInNjcmlwdGVycm9yIiwnU2NyaXB0IGVycm9yIGZvciAiJyt0LmlkKyhpLmxlbmd0aD8nIiwgbmVlZGVkIGJ5OiAnK2kuam9pbigiLCAiKTonIicpLGUsW3QuaWRdKSl9fX0scS5yZXF1aXJlPXEubWFrZVJlcXVpcmUoKSxxfWZ1bmN0aW9uIGdldEludGVyYWN0aXZlU2NyaXB0KCl7cmV0dXJuIGludGVyYWN0aXZlU2NyaXB0JiYiaW50ZXJhY3RpdmUiPT09aW50ZXJhY3RpdmVTY3JpcHQucmVhZHlTdGF0ZT9pbnRlcmFjdGl2ZVNjcmlwdDooZWFjaFJldmVyc2Uoc2NyaXB0cygpLGZ1bmN0aW9uKGUpe2lmKCJpbnRlcmFjdGl2ZSI9PT1lLnJlYWR5U3RhdGUpcmV0dXJuIGludGVyYWN0aXZlU2NyaXB0PWV9KSxpbnRlcmFjdGl2ZVNjcmlwdCl9dmFyIHJlcSxzLGhlYWQsYmFzZUVsZW1lbnQsZGF0YU1haW4sc3JjLGludGVyYWN0aXZlU2NyaXB0LGN1cnJlbnRseUFkZGluZ1NjcmlwdCxtYWluU2NyaXB0LHN1YlBhdGgsdmVyc2lvbj0iMi4zLjUiLGNvbW1lbnRSZWdFeHA9L1wvXCpbXHNcU10qP1wqXC98KFteOiInPV18XilcL1wvLiokL2dtLGNqc1JlcXVpcmVSZWdFeHA9L1teLl1ccypyZXF1aXJlXHMqXChccypbIiddKFteJyJcc10rKVsiJ11ccypcKS9nLGpzU3VmZml4UmVnRXhwPS9cLmpzJC8sY3VyckRpclJlZ0V4cD0vXlwuXC8vLG9wPU9iamVjdC5wcm90b3R5cGUsb3N0cmluZz1vcC50b1N0cmluZyxoYXNPd249b3AuaGFzT3duUHJvcGVydHksaXNCcm93c2VyPSEoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yfHwhd2luZG93LmRvY3VtZW50KSxpc1dlYldvcmtlcj0haXNCcm93c2VyJiYidW5kZWZpbmVkIiE9dHlwZW9mIGltcG9ydFNjcmlwdHMscmVhZHlSZWdFeHA9aXNCcm93c2VyJiYiUExBWVNUQVRJT04gMyI9PT1uYXZpZ2F0b3IucGxhdGZvcm0/L15jb21wbGV0ZSQvOi9eKGNvbXBsZXRlfGxvYWRlZCkkLyxkZWZDb250ZXh0TmFtZT0iXyIsaXNPcGVyYT0idW5kZWZpbmVkIiE9dHlwZW9mIG9wZXJhJiYiW29iamVjdCBPcGVyYV0iPT09b3BlcmEudG9TdHJpbmcoKSxjb250ZXh0cz17fSxjZmc9e30sZ2xvYmFsRGVmUXVldWU9W10sdXNlSW50ZXJhY3RpdmU9ITE7aWYodm9pZCAwPT09ZGVmaW5lKXtpZih2b2lkIDAhPT1yZXF1aXJlanMpe2lmKGlzRnVuY3Rpb24ocmVxdWlyZWpzKSlyZXR1cm47Y2ZnPXJlcXVpcmVqcyxyZXF1aXJlanM9dm9pZCAwfXZvaWQgMD09PXJlcXVpcmV8fGlzRnVuY3Rpb24ocmVxdWlyZSl8fChjZmc9cmVxdWlyZSxyZXF1aXJlPXZvaWQgMCkscmVxPXJlcXVpcmVqcz1mdW5jdGlvbihlLHQsaSxyKXt2YXIgbixvLGE9ZGVmQ29udGV4dE5hbWU7cmV0dXJuIGlzQXJyYXkoZSl8fCJzdHJpbmciPT10eXBlb2YgZXx8KG89ZSxpc0FycmF5KHQpPyhlPXQsdD1pLGk9cik6ZT1bXSksbyYmby5jb250ZXh0JiYoYT1vLmNvbnRleHQpLChuPWdldE93bihjb250ZXh0cyxhKSl8fChuPWNvbnRleHRzW2FdPXJlcS5zLm5ld0NvbnRleHQoYSkpLG8mJm4uY29uZmlndXJlKG8pLG4ucmVxdWlyZShlLHQsaSl9LHJlcS5jb25maWc9ZnVuY3Rpb24oZSl7cmV0dXJuIHJlcShlKX0scmVxLm5leHRUaWNrPXZvaWQgMCE9PXNldFRpbWVvdXQ/ZnVuY3Rpb24oZSl7c2V0VGltZW91dChlLDQpfTpmdW5jdGlvbihlKXtlKCl9LHJlcXVpcmV8fChyZXF1aXJlPXJlcSkscmVxLnZlcnNpb249dmVyc2lvbixyZXEuanNFeHRSZWdFeHA9L15cL3w6fFw/fFwuanMkLyxyZXEuaXNCcm93c2VyPWlzQnJvd3NlcixzPXJlcS5zPXtjb250ZXh0czpjb250ZXh0cyxuZXdDb250ZXh0Om5ld0NvbnRleHR9LHJlcSh7fSksZWFjaChbInRvVXJsIiwidW5kZWYiLCJkZWZpbmVkIiwic3BlY2lmaWVkIl0sZnVuY3Rpb24oZSl7cmVxW2VdPWZ1bmN0aW9uKCl7dmFyIHQ9Y29udGV4dHNbZGVmQ29udGV4dE5hbWVdO3JldHVybiB0LnJlcXVpcmVbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0pLGlzQnJvd3NlciYmKGhlYWQ9cy5oZWFkPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sKGJhc2VFbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIilbMF0pJiYoaGVhZD1zLmhlYWQ9YmFzZUVsZW1lbnQucGFyZW50Tm9kZSkpLHJlcS5vbkVycm9yPWRlZmF1bHRPbkVycm9yLHJlcS5jcmVhdGVOb2RlPWZ1bmN0aW9uKGUsdCxpKXt2YXIgcj1lLnhodG1sP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImh0bWw6c2NyaXB0Iik6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cmV0dXJuIHIudHlwZT1lLnNjcmlwdFR5cGV8fCJ0ZXh0L2phdmFzY3JpcHQiLHIuY2hhcnNldD0idXRmLTgiLHIuYXN5bmM9ITAscn0scmVxLmxvYWQ9ZnVuY3Rpb24oZSx0LGkpe3ZhciByLG49ZSYmZS5jb25maWd8fHt9O2lmKGlzQnJvd3NlcilyZXR1cm4ocj1yZXEuY3JlYXRlTm9kZShuLHQsaSkpLnNldEF0dHJpYnV0ZSgiZGF0YS1yZXF1aXJlY29udGV4dCIsZS5jb250ZXh0TmFtZSksci5zZXRBdHRyaWJ1dGUoImRhdGEtcmVxdWlyZW1vZHVsZSIsdCksIXIuYXR0YWNoRXZlbnR8fHIuYXR0YWNoRXZlbnQudG9TdHJpbmcmJnIuYXR0YWNoRXZlbnQudG9TdHJpbmcoKS5pbmRleE9mKCJbbmF0aXZlIGNvZGUiKTwwfHxpc09wZXJhPyhyLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUub25TY3JpcHRMb2FkLCExKSxyLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlLm9uU2NyaXB0RXJyb3IsITEpKToodXNlSW50ZXJhY3RpdmU9ITAsci5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixlLm9uU2NyaXB0TG9hZCkpLHIuc3JjPWksbi5vbk5vZGVDcmVhdGVkJiZuLm9uTm9kZUNyZWF0ZWQocixuLHQsaSksY3VycmVudGx5QWRkaW5nU2NyaXB0PXIsYmFzZUVsZW1lbnQ/aGVhZC5pbnNlcnRCZWZvcmUocixiYXNlRWxlbWVudCk6aGVhZC5hcHBlbmRDaGlsZChyKSxjdXJyZW50bHlBZGRpbmdTY3JpcHQ9bnVsbCxyO2lmKGlzV2ViV29ya2VyKXRyeXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwwKSxpbXBvcnRTY3JpcHRzKGkpLGUuY29tcGxldGVMb2FkKHQpfWNhdGNoKHIpe2Uub25FcnJvcihtYWtlRXJyb3IoImltcG9ydHNjcmlwdHMiLCJpbXBvcnRTY3JpcHRzIGZhaWxlZCBmb3IgIit0KyIgYXQgIitpLHIsW3RdKSl9fSxpc0Jyb3dzZXImJiFjZmcuc2tpcERhdGFNYWluJiZlYWNoUmV2ZXJzZShzY3JpcHRzKCksZnVuY3Rpb24oZSl7aWYoaGVhZHx8KGhlYWQ9ZS5wYXJlbnROb2RlKSxkYXRhTWFpbj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1tYWluIikpcmV0dXJuIG1haW5TY3JpcHQ9ZGF0YU1haW4sY2ZnLmJhc2VVcmx8fC0xIT09bWFpblNjcmlwdC5pbmRleE9mKCIhIil8fChzcmM9bWFpblNjcmlwdC5zcGxpdCgiLyIpLG1haW5TY3JpcHQ9c3JjLnBvcCgpLHN1YlBhdGg9c3JjLmxlbmd0aD9zcmMuam9pbigiLyIpKyIvIjoiLi8iLGNmZy5iYXNlVXJsPXN1YlBhdGgpLG1haW5TY3JpcHQ9bWFpblNjcmlwdC5yZXBsYWNlKGpzU3VmZml4UmVnRXhwLCIiKSxyZXEuanNFeHRSZWdFeHAudGVzdChtYWluU2NyaXB0KSYmKG1haW5TY3JpcHQ9ZGF0YU1haW4pLGNmZy5kZXBzPWNmZy5kZXBzP2NmZy5kZXBzLmNvbmNhdChtYWluU2NyaXB0KTpbbWFpblNjcmlwdF0sITB9KSxkZWZpbmU9ZnVuY3Rpb24oZSx0LGkpe3ZhciByLG47InN0cmluZyIhPXR5cGVvZiBlJiYoaT10LHQ9ZSxlPW51bGwpLGlzQXJyYXkodCl8fChpPXQsdD1udWxsKSwhdCYmaXNGdW5jdGlvbihpKSYmKHQ9W10saS5sZW5ndGgmJihpLnRvU3RyaW5nKCkucmVwbGFjZShjb21tZW50UmVnRXhwLGNvbW1lbnRSZXBsYWNlKS5yZXBsYWNlKGNqc1JlcXVpcmVSZWdFeHAsZnVuY3Rpb24oZSxpKXt0LnB1c2goaSl9KSx0PSgxPT09aS5sZW5ndGg/WyJyZXF1aXJlIl06WyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdKS5jb25jYXQodCkpKSx1c2VJbnRlcmFjdGl2ZSYmKHI9Y3VycmVudGx5QWRkaW5nU2NyaXB0fHxnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpKSYmKGV8fChlPXIuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVtb2R1bGUiKSksbj1jb250ZXh0c1tyLmdldEF0dHJpYnV0ZSgiZGF0YS1yZXF1aXJlY29udGV4dCIpXSksbj8obi5kZWZRdWV1ZS5wdXNoKFtlLHQsaV0pLG4uZGVmUXVldWVNYXBbZV09ITApOmdsb2JhbERlZlF1ZXVlLnB1c2goW2UsdCxpXSl9LGRlZmluZS5hbWQ9e2pRdWVyeTohMH0scmVxLmV4ZWM9ZnVuY3Rpb24odGV4dCl7cmV0dXJuIGV2YWwodGV4dCl9LHJlcShjZmcpfX0odGhpcywidW5kZWZpbmVkIj09dHlwZW9mIHNldFRpbWVvdXQ/dm9pZCAwOnNldFRpbWVvdXQp
Protocol
HTTP/1.1
Server
194.66.87.68 , United Kingdom, ASN786 (JANET Jisc Services Limited, GB),
Reverse DNS
campusmoodle.rgu.ac.uk
Software
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4 / PHP/7.1.4
Resource Hash
a3af78e67fbc6866690b74c4e4e0d79cc66cc20cf1d2c7dadf75ece406e5c1e1

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sun, 06 Sep 2020 09:31:39 GMT
Content-Encoding
gzip
X-Powered-By
PHP/7.1.4
Transfer-Encoding
chunked
Content-Disposition
inline; filename="requirejs.php"
Connection
Keep-Alive
Pragma
Last-Modified
Thu, 13 Aug 2020 20:32:42 GMT
Server
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4
Etag
"21e98ebe9c0adb14a62cd076951a4c94f9fbfe39"
Vary
Accept-Encoding
Content-Type
application/javascript; charset=utf-8
Cache-Control
public, max-age=7776000, immutable
Accept-Ranges
none
Keep-Alive
timeout=5, max=99
Expires
Sat, 05 Dec 2020 09:31:39 GMT
yui_combo.php
campusmoodle.rgu.ac.uk/theme/
22 KB
7 KB
Script
General
Full URL
http://campusmoodle.rgu.ac.uk/theme/yui_combo.php?m/1591866501/core/widget/widget-focusafterclose-min.js&3.17.2/plugin/plugin-min.js&m/1591866501/core/lockscroll/lockscroll-min.js&m/1591866501/core/notification/notification-dialogue-min.js&m/1591866501/core/notification/notification-alert-min.js&m/1591866501/core/notification/notification-exception-min.js&m/1591866501/core/notification/notification-ajaxexception-min.js&m/1591866501/filter_glossary/autolinker/autolinker-min.js
Requested by
Host: application
URL: data:application/javascript;base64,LyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCnR5cGVvZiBZVUkhPSJ1bmRlZmluZWQiJiYoWVVJLl9ZVUk9WVVJKTt2YXIgWVVJPWZ1bmN0aW9uKCl7dmFyIGU9MCx0PXRoaXMsbj1hcmd1bWVudHMscj1uLmxlbmd0aCxpPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmUuaGFzT3duUHJvcGVydHkmJmUgaW5zdGFuY2VvZiB0fSxzPXR5cGVvZiBZVUlfY29uZmlnIT0idW5kZWZpbmVkIiYmWVVJX2NvbmZpZztpKHQsWVVJKT8odC5faW5pdCgpLFlVSS5HbG9iYWxDb25maWcmJnQuYXBwbHlDb25maWcoWVVJLkdsb2JhbENvbmZpZykscyYmdC5hcHBseUNvbmZpZyhzKSxyfHx0Ll9zZXR1cCgpKTp0PW5ldyBZVUk7aWYocil7Zm9yKDtlPHI7ZSsrKXQuYXBwbHlDb25maWcobltlXSk7dC5fc2V0dXAoKX1yZXR1cm4gdC5pbnN0YW5jZU9mPWksdH07KGZ1bmN0aW9uKCl7dmFyIGUsdCxuPSIzLjE3LjIiLHI9Ii4iLGk9Imh0dHA6Ly95dWkueWFob29hcGlzLmNvbS8iLHM9Inl1aTMtanMtZW5hYmxlZCIsbz0ieXVpMy1jc3Mtc3RhbXAiLHU9ZnVuY3Rpb24oKXt9LGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLGY9eyJpby54ZHJSZWFkeSI6MSwiaW8ueGRyUmVzcG9uc2UiOjEsIlNXRi5ldmVudEhhbmRsZXIiOjF9LGw9dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCIsYz1sP3dpbmRvdzpudWxsLGg9bD9jLmRvY3VtZW50Om51bGwscD1oJiZoLmRvY3VtZW50RWxlbWVudCxkPXAmJnAuY2xhc3NOYW1lLHY9e30sbT0obmV3IERhdGUpLmdldFRpbWUoKSxnPWZ1bmN0aW9uKGUsdCxuLHIpe2UmJmUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLHIpOmUmJmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9uIit0LG4pfSx5PWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcil0cnl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbixyKX1jYXRjaChpKXt9ZWxzZSBlJiZlLmRldGFjaEV2ZW50JiZlLmRldGFjaEV2ZW50KCJvbiIrdCxuKX0sYj1mdW5jdGlvbigpe1lVSS5FbnYuRE9NUmVhZHk9ITAsbCYmeShoLCJET01Db250ZW50TG9hZGVkIixiKX0sdz1mdW5jdGlvbigpe1lVSS5FbnYud2luZG93TG9hZGVkPSEwLFlVSS5FbnYuRE9NUmVhZHk9ITAsbCYmeSh3aW5kb3csImxvYWQiLHcpfSxFPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5FbnYuX2xvYWRlcixyPVsibG9hZGVyLWJhc2UiXSxpPVlVSS5FbnYscz1pLm1vZHM7cmV0dXJuIG4/KG4uaWdub3JlUmVnaXN0ZXJlZD0hMSxuLm9uRW5kPW51bGwsbi5kYXRhPW51bGwsbi5yZXF1aXJlZD1bXSxuLmxvYWRUeXBlPW51bGwpOihuPW5ldyBlLkxvYWRlcihlLmNvbmZpZyksZS5FbnYuX2xvYWRlcj1uKSxzJiZzLmxvYWRlciYmKHI9W10uY29uY2F0KHIsWVVJLkVudi5sb2FkZXJFeHRyYXMpKSxZVUkuRW52LmNvcmU9ZS5BcnJheS5kZWR1cGUoW10uY29uY2F0KFlVSS5FbnYuY29yZSxyKSksbn0sUz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSx4PXtzdWNjZXNzOiEwfTtwJiZkLmluZGV4T2Yocyk9PS0xJiYoZCYmKGQrPSIgIiksZCs9cyxwLmNsYXNzTmFtZT1kKSxuLmluZGV4T2YoIkAiKT4tMSYmKG49IjMuNS4wIiksZT17YXBwbHlDb25maWc6ZnVuY3Rpb24oZSl7ZT1lfHx1O3ZhciB0LG4scj10aGlzLmNvbmZpZyxpPXIubW9kdWxlcyxzPXIuZ3JvdXBzLG89ci5hbGlhc2VzLGE9dGhpcy5FbnYuX2xvYWRlcjtmb3IobiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0PWVbbl0saSYmbj09Im1vZHVsZXMiP1MoaSx0KTpvJiZuPT0iYWxpYXNlcyI/UyhvLHQpOnMmJm49PSJncm91cHMiP1Mocyx0KTpuPT0id2luIj8ocltuXT10JiZ0LmNvbnRlbnRXaW5kb3d8fHQsci5kb2M9cltuXT9yW25dLmRvY3VtZW50Om51bGwpOm4hPSJfeXVpZCImJihyW25dPXQpKTthJiZhLl9jb25maWcoZSl9LF9jb25maWc6ZnVuY3Rpb24oZSl7dGhpcy5hcHBseUNvbmZpZyhlKX0sX2luaXQ6ZnVuY3Rpb24oKXt2YXIgZSx0LHI9dGhpcyxzPVlVSS5FbnYsdT1yLkVudixhO3IudmVyc2lvbj1uO2lmKCF1KXtyLkVudj17Y29yZTpbImdldCIsImZlYXR1cmVzIiwiaW50bC1iYXNlIiwieXVpLWxvZyIsInl1aS1sYXRlciIsImxvYWRlci1iYXNlIiwibG9hZGVyLXJvbGx1cCIsImxvYWRlci15dWkzIl0sbG9hZGVyRXh0cmFzOlsibG9hZGVyLXJvbGx1cCIsImxvYWRlci15dWkzIl0sbW9kczp7fSx2ZXJzaW9uczp7fSxiYXNlOmksY2RuOmkrbisiL2J1aWxkLyIsX2lkeDowLF91c2VkOnt9LF9hdHRhY2hlZDp7fSxfZXhwb3J0ZWQ6e30sX21pc3NlZDpbXSxfeWlkeDowLF91aWR4OjAsX2d1aWRwOiJ5IixfbG9hZGVkOnt9LF9CQVNFX1JFOi8oPzpcPyg/OlteJl0qJikqKFteJl0qKSk/XGIoeXVpKD86LVx3Kyk/KVwvXDIoPzotKG1pbnxkZWJ1ZykpP1wuanMvLHBhcnNlQmFzZVBhdGg6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1hdGNoKHQpLHIsaTtyZXR1cm4gbiYmKHI9UmVnRXhwLmxlZnRDb250ZXh0fHxlLnNsaWNlKDAsZS5pbmRleE9mKG5bMF0pKSxpPW5bM10sblsxXSYmKHIrPSI/IituWzFdKSxyPXtmaWx0ZXI6aSxwYXRoOnJ9KSxyfSxnZXRCYXNlOnMmJnMuZ2V0QmFzZXx8ZnVuY3Rpb24odCl7dmFyIG49aCYmaC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iil8fFtdLGk9dS5jZG4scyxvLGEsZjtmb3Iobz0wLGE9bi5sZW5ndGg7bzxhOysrbyl7Zj1uW29dLnNyYztpZihmKXtzPXIuRW52LnBhcnNlQmFzZVBhdGgoZix0KTtpZihzKXtlPXMuZmlsdGVyLGk9cy5wYXRoO2JyZWFrfX19cmV0dXJuIGl9fSx1PXIuRW52LHUuX2xvYWRlZFtuXT17fTtpZihzJiZyIT09WVVJKXUuX3lpZHg9KytzLl95aWR4LHUuX2d1aWRwPSgieXVpXyIrbisiXyIrdS5feWlkeCsiXyIrbSkucmVwbGFjZSgvW15hLXowLTlfXSsvZywiXyIpO2Vsc2UgaWYoWVVJLl9ZVUkpe3M9WVVJLl9ZVUkuRW52LHUuX3lpZHgrPXMuX3lpZHgsdS5fdWlkeCs9cy5fdWlkeDtmb3IoYSBpbiBzKWEgaW4gdXx8KHVbYV09c1thXSk7ZGVsZXRlIFlVSS5fWVVJfXIuaWQ9ci5zdGFtcChyKSx2W3IuaWRdPXJ9ci5jb25zdHJ1Y3Rvcj1ZVUksci5jb25maWc9ci5jb25maWd8fHtib290c3RyYXA6ITAsY2FjaGVVc2U6ITAsZGVidWc6ITAsZG9jOmgsZmV0Y2hDU1M6ITAsdGhyb3dGYWlsOiEwLHVzZUJyb3dzZXJDb25zb2xlOiEwLHVzZU5hdGl2ZUVTNTohMCx3aW46YyxnbG9iYWw6RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0saCYmIWguZ2V0RWxlbWVudEJ5SWQobyk/KHQ9aC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LmlubmVySFRNTD0nPGRpdiBpZD0iJytvKyciIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQiPjwvZGl2PicsWVVJLkVudi5jc3NTdGFtcEVsPXQuZmlyc3RDaGlsZCxoLmJvZHk/aC5ib2R5LmFwcGVuZENoaWxkKFlVSS5FbnYuY3NzU3RhbXBFbCk6cC5pbnNlcnRCZWZvcmUoWVVJLkVudi5jc3NTdGFtcEVsLHAuZmlyc3RDaGlsZCkpOmgmJmguZ2V0RWxlbWVudEJ5SWQobykmJiFZVUkuRW52LmNzc1N0YW1wRWwmJihZVUkuRW52LmNzc1N0YW1wRWw9aC5nZXRFbGVtZW50QnlJZChvKSksci5jb25maWcubGFuZz1yLmNvbmZpZy5sYW5nfHwiZW4tVVMiLHIuY29uZmlnLmJhc2U9WVVJLmNvbmZpZy5iYXNlfHxyLkVudi5nZXRCYXNlKHIuRW52Ll9CQVNFX1JFKTtpZighZXx8ISJtaW5kZWJ1ZyIuaW5kZXhPZihlKSllPSJtaW4iO2U9ZT8iLSIrZTplLHIuY29uZmlnLmxvYWRlclBhdGg9WVVJLmNvbmZpZy5sb2FkZXJQYXRofHwibG9hZGVyL2xvYWRlciIrZSsiLmpzIn0sX3NldHVwOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLG49W10scj1ZVUkuRW52Lm1vZHMsaT10LmNvbmZpZy5jb3JlfHxbXS5jb25jYXQoWVVJLkVudi5jb3JlKTtmb3IoZT0wO2U8aS5sZW5ndGg7ZSsrKXJbaVtlXV0mJm4ucHVzaChpW2VdKTt0Ll9hdHRhY2goWyJ5dWktYmFzZSJdKSx0Ll9hdHRhY2gobiksdC5Mb2FkZXImJkUodCl9LGFwcGx5VG86ZnVuY3Rpb24oZSx0LG4pe2lmKHQgaW4gZil7dmFyIHI9dltlXSxpLHMsbztpZihyKXtpPXQuc3BsaXQoIi4iKSxzPXI7Zm9yKG89MDtvPGkubGVuZ3RoO28rPTEpcz1zW2lbb11dLHN8fHRoaXMubG9nKCJhcHBseVRvIG5vdCBmb3VuZDogIit0LCJ3YXJuIiwieXVpIik7cmV0dXJuIHMmJnMuYXBwbHkocixuKX1yZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5sb2codCsiOiBhcHBseVRvIG5vdCBhbGxvd2VkIiwid2FybiIsInl1aSIpLG51bGx9LGFkZDpmdW5jdGlvbihlLHQsbixyKXtyPXJ8fHt9O3ZhciBpPVlVSS5FbnYscz17bmFtZTplLGZuOnQsdmVyc2lvbjpuLGRldGFpbHM6cn0sbz17fSx1LGEsZixsLGM9aS52ZXJzaW9ucztpLm1vZHNbZV09cyxjW25dPWNbbl18fHt9LGNbbl1bZV09cztmb3IobCBpbiB2KXYuaGFzT3duUHJvcGVydHkobCkmJihhPXZbbF0sb1thLmlkXXx8KG9bYS5pZF09ITAsdT1hLkVudi5fbG9hZGVyLHUmJihmPXUuZ2V0TW9kdWxlSW5mbyhlKSwoIWZ8fGYudGVtcCkmJnUuYWRkTW9kdWxlKHIsZSkpKSk7cmV0dXJuIHRoaXN9LF9hdHRhY2g6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvLHUsYSxmPVlVSS5FbnYubW9kcyxsPVlVSS5FbnYuYWxpYXNlcyxjPXRoaXMsaCxwPVlVSS5FbnYuX3JlbmRlcmVkTW9kcyxkPWMuRW52Ll9sb2FkZXIsdj1jLkVudi5fYXR0YWNoZWQsbT1jLkVudi5fZXhwb3J0ZWQsZz1lLmxlbmd0aCxkLHksYix3PVtdLEUsUyx4LFQsTixDLGs7Zm9yKG49MDtuPGc7bisrKXtyPWVbbl0saT1mW3JdLHcucHVzaChyKTtpZihkJiZkLmNvbmRpdGlvbnNbcl0pZm9yKGggaW4gZC5jb25kaXRpb25zW3JdKWQuY29uZGl0aW9uc1tyXS5oYXNPd25Qcm9wZXJ0eShoKSYmKHk9ZC5jb25kaXRpb25zW3JdW2hdLGI9eSYmKHkudWEmJmMuVUFbeS51YV18fHkudGVzdCYmeS50ZXN0KGMpKSxiJiZ3LnB1c2goeS5uYW1lKSl9ZT13LGc9ZS5sZW5ndGg7Zm9yKG49MDtuPGc7bisrKWlmKCF2W2Vbbl1dKXtyPWVbbl0saT1mW3JdO2lmKGwmJmxbcl0mJiFpKXtjLl9hdHRhY2gobFtyXSk7Y29udGludWV9aWYoIWkpVD1kJiZkLmdldE1vZHVsZUluZm8ociksVCYmKGk9VCx0PSEwKSwhdCYmciYmci5pbmRleE9mKCJza2luLSIpPT09LTEmJnIuaW5kZXhPZigiY3NzIik9PT0tMSYmKGMuRW52Ll9taXNzZWQucHVzaChyKSxjLkVudi5fbWlzc2VkPWMuQXJyYXkuZGVkdXBlKGMuRW52Ll9taXNzZWQpLGMubWVzc2FnZSgiTk9UIGxvYWRlZDogIityLCJ3YXJuIiwieXVpIikpO2Vsc2V7dltyXT0hMDtmb3IoaD0wO2g8Yy5FbnYuX21pc3NlZC5sZW5ndGg7aCsrKWMuRW52Ll9taXNzZWRbaF09PT1yJiYoYy5tZXNzYWdlKCJGb3VuZDogIityKyIgKHdhcyByZXBvcnRlZCBhcyBtaXNzaW5nIGVhcmxpZXIpIiwid2FybiIsInl1aSIpLGMuRW52Ll9taXNzZWQuc3BsaWNlKGgsMSkpO2lmKGQmJiFkLl9jYW5CZUF0dGFjaGVkKHIpKXJldHVybiEwO2lmKGQmJnAmJnBbcl0mJnBbcl0udGVtcCl7ZC5nZXRSZXF1aXJlcyhwW3JdKSxvPVtdLFQ9ZC5nZXRNb2R1bGVJbmZvKHIpO2ZvcihoIGluIFQuZXhwYW5kZWRfbWFwKVQuZXhwYW5kZWRfbWFwLmhhc093blByb3BlcnR5KGgpJiZvLnB1c2goaCk7Yy5fYXR0YWNoKG8pfXM9aS5kZXRhaWxzLG89cy5yZXF1aXJlcyxTPXMuZXMsdT1zLnVzZSxhPXMuYWZ0ZXIscy5sYW5nJiYobz1vfHxbXSxvLnVuc2hpZnQoImludGwiKSk7aWYobyl7eD1vLmxlbmd0aDtmb3IoaD0wO2g8eDtoKyspaWYoIXZbb1toXV0pe2lmKCFjLl9hdHRhY2gobykpcmV0dXJuITE7YnJlYWt9fWlmKGEpZm9yKGg9MDtoPGEubGVuZ3RoO2grKylpZighdlthW2hdXSl7aWYoIWMuX2F0dGFjaChhLCEwKSlyZXR1cm4hMTticmVha31pZihpLmZuKXtFPVtjLHJdO2lmKFMpe2s9e30sQz17fSxFLnB1c2goayxDKTtpZihvKXt4PW8ubGVuZ3RoO2ZvcihoPTA7aDx4O2grKylrW29baF1dPW0uaGFzT3duUHJvcGVydHkob1toXSk/bVtvW2hdXTpjfX1pZihjLmNvbmZpZy50aHJvd0ZhaWwpQz1pLmZuCi5hcHBseShTP3VuZGVmaW5lZDppLEUpO2Vsc2UgdHJ5e0M9aS5mbi5hcHBseShTP3VuZGVmaW5lZDppLEUpfWNhdGNoKEwpe3JldHVybiBjLmVycm9yKCJBdHRhY2ggZXJyb3I6ICIrcixMLHIpLCExfVMmJihtW3JdPUMsTj1pLmRldGFpbHMuY29uZGl0aW9uLE4mJk4ud2hlbj09PSJpbnN0ZWFkIiYmKG1bTi50cmlnZ2VyXT1DKSl9aWYodSlmb3IoaD0wO2g8dS5sZW5ndGg7aCsrKWlmKCF2W3VbaF1dKXtpZighYy5fYXR0YWNoKHUpKXJldHVybiExO2JyZWFrfX19cmV0dXJuITB9LF9kZWxheUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPVsiZXZlbnQtYmFzZSJdO3JldHVybiB0PW4uTGFuZy5pc09iamVjdCh0KT90OntldmVudDp0fSx0LmV2ZW50PT09ImxvYWQiJiZyLnB1c2goImV2ZW50LXN5bnRoZXRpYyIpLGZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzO24uX3VzZShyLGZ1bmN0aW9uKCl7bi5vbih0LmV2ZW50LGZ1bmN0aW9uKCl7aVsxXS5kZWxheVVudGlsPXQuZXZlbnQsZS5hcHBseShuLGkpfSx0LmFyZ3MpfSl9fSx1c2U6ZnVuY3Rpb24oKXt2YXIgZT1hLmNhbGwoYXJndW1lbnRzLDApLHQ9ZVtlLmxlbmd0aC0xXSxuPXRoaXMscj0wLGkscz1uLkVudixvPSEwO24uTGFuZy5pc0Z1bmN0aW9uKHQpPyhlLnBvcCgpLG4uY29uZmlnLmRlbGF5VW50aWwmJih0PW4uX2RlbGF5Q2FsbGJhY2sodCxuLmNvbmZpZy5kZWxheVVudGlsKSkpOnQ9bnVsbCxuLkxhbmcuaXNBcnJheShlWzBdKSYmKGU9ZVswXSk7aWYobi5jb25maWcuY2FjaGVVc2Upe3doaWxlKGk9ZVtyKytdKWlmKCFzLl9hdHRhY2hlZFtpXSl7bz0hMTticmVha31pZihvKXJldHVybiBlLmxlbmd0aCxuLl9ub3RpZnkodCx4LGUpLG59cmV0dXJuIG4uX2xvYWRpbmc/KG4uX3VzZVF1ZXVlPW4uX3VzZVF1ZXVlfHxuZXcgbi5RdWV1ZSxuLl91c2VRdWV1ZS5hZGQoW2UsdF0pKTpuLl91c2UoZSxmdW5jdGlvbihuLHIpe24uX25vdGlmeSh0LHIsZSl9KSxufSxyZXF1aXJlOmZ1bmN0aW9uKCl7dmFyIGU9YS5jYWxsKGFyZ3VtZW50cyksdDt0eXBlb2YgZVtlLmxlbmd0aC0xXT09ImZ1bmN0aW9uIiYmKHQ9ZS5wb3AoKSxlLnB1c2goZnVuY3Rpb24obil7dmFyIHIsaT1lLmxlbmd0aCxzPW4uRW52Ll9leHBvcnRlZCxvPXt9O2ZvcihyPTA7cjxpO3IrKylzLmhhc093blByb3BlcnR5KGVbcl0pJiYob1tlW3JdXT1zW2Vbcl1dKTt0LmNhbGwodW5kZWZpbmVkLG4sbyl9KSksdGhpcy51c2UuYXBwbHkodGhpcyxlKX0sX25vdGlmeTpmdW5jdGlvbihlLHQsbil7aWYoIXQuc3VjY2VzcyYmdGhpcy5jb25maWcubG9hZEVycm9yRm4pdGhpcy5jb25maWcubG9hZEVycm9yRm4uY2FsbCh0aGlzLHRoaXMsZSx0LG4pO2Vsc2UgaWYoZSl7dGhpcy5FbnYuX21pc3NlZCYmdGhpcy5FbnYuX21pc3NlZC5sZW5ndGgmJih0Lm1zZz0iTWlzc2luZyBtb2R1bGVzOiAiK3RoaXMuRW52Ll9taXNzZWQuam9pbigpLHQuc3VjY2Vzcz0hMSk7aWYodGhpcy5jb25maWcudGhyb3dGYWlsKWUodGhpcyx0KTtlbHNlIHRyeXtlKHRoaXMsdCl9Y2F0Y2gocil7dGhpcy5lcnJvcigidXNlIGNhbGxiYWNrIGVycm9yIixyLG4pfX19LF91c2U6ZnVuY3Rpb24oZSx0KXt0aGlzLkFycmF5fHx0aGlzLl9hdHRhY2goWyJ5dWktYmFzZSJdKTt2YXIgcixpLHMsbz10aGlzLHU9WVVJLkVudixhPXUubW9kcyxmPW8uRW52LGw9Zi5fdXNlZCxjPXUuYWxpYXNlcyxoPXUuX2xvYWRlclF1ZXVlLHA9ZVswXSxkPW8uQXJyYXksdj1vLmNvbmZpZyxtPXYuYm9vdHN0cmFwLGc9W10seSxiPVtdLHc9ITAsUz12LmZldGNoQ1NTLHg9ZnVuY3Rpb24oZSx0KXt2YXIgcj0wLGk9W10scyxvLGYsaCxwO2lmKCFlLmxlbmd0aClyZXR1cm47aWYoYyl7bz1lLmxlbmd0aDtmb3Iocj0wO3I8bztyKyspY1tlW3JdXSYmIWFbZVtyXV0/aT1bXS5jb25jYXQoaSxjW2Vbcl1dKTppLnB1c2goZVtyXSk7ZT1pfW89ZS5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKXtzPWVbcl0sdHx8Yi5wdXNoKHMpO2lmKGxbc10pY29udGludWU7Zj1hW3NdLGg9bnVsbCxwPW51bGwsZj8obFtzXT0hMCxoPWYuZGV0YWlscy5yZXF1aXJlcyxwPWYuZGV0YWlscy51c2UpOnUuX2xvYWRlZFtuXVtzXT9sW3NdPSEwOmcucHVzaChzKSxoJiZoLmxlbmd0aCYmeChoKSxwJiZwLmxlbmd0aCYmeChwLDEpfX0sVD1mdW5jdGlvbihuKXt2YXIgcj1ufHx7c3VjY2VzczohMCxtc2c6Im5vdCBkeW5hbWljIn0saSxzLHU9ITAsYT1yLmRhdGE7by5fbG9hZGluZz0hMSxhJiYocz1nLGc9W10sYj1bXSx4KGEpLGk9Zy5sZW5ndGgsaSYmW10uY29uY2F0KGcpLnNvcnQoKS5qb2luKCk9PXMuc29ydCgpLmpvaW4oKSYmKGk9ITEpKSxpJiZhPyhvLl9sb2FkaW5nPSEwLG8uX3VzZShnLGZ1bmN0aW9uKCl7by5fYXR0YWNoKGEpJiZvLl9ub3RpZnkodCxyLGEpfSkpOihhJiYodT1vLl9hdHRhY2goYSkpLHUmJm8uX25vdGlmeSh0LHIsZSkpLG8uX3VzZVF1ZXVlJiZvLl91c2VRdWV1ZS5zaXplKCkmJiFvLl9sb2FkaW5nJiZvLl91c2UuYXBwbHkobyxvLl91c2VRdWV1ZS5uZXh0KCkpfTtpZihwPT09IioiKXtlPVtdO2Zvcih5IGluIGEpYS5oYXNPd25Qcm9wZXJ0eSh5KSYmZS5wdXNoKHkpO3JldHVybiB3PW8uX2F0dGFjaChlKSx3JiZUKCksb31yZXR1cm4oYS5sb2FkZXJ8fGFbImxvYWRlci1iYXNlIl0pJiYhby5Mb2FkZXImJm8uX2F0dGFjaChbImxvYWRlciIrKGEubG9hZGVyPyIiOiItYmFzZSIpXSksbSYmby5Mb2FkZXImJmUubGVuZ3RoJiYoaT1FKG8pLGkucmVxdWlyZShlKSxpLmlnbm9yZVJlZ2lzdGVyZWQ9ITAsaS5fYm9vdD0hMCxpLmNhbGN1bGF0ZShudWxsLFM/bnVsbDoianMiKSxlPWkuc29ydGVkLGkuX2Jvb3Q9ITEpLHgoZSkscj1nLmxlbmd0aCxyJiYoZz1kLmRlZHVwZShnKSxyPWcubGVuZ3RoKSxtJiZyJiZvLkxvYWRlcj8oby5fbG9hZGluZz0hMCxpPUUobyksaS5vbkVuZD1ULGkuY29udGV4dD1vLGkuZGF0YT1lLGkuaWdub3JlUmVnaXN0ZXJlZD0hMSxpLnJlcXVpcmUoZyksaS5pbnNlcnQobnVsbCxTP251bGw6ImpzIikpOm0mJnImJm8uR2V0JiYhZi5ib290c3RyYXBwZWQ/KG8uX2xvYWRpbmc9ITAscz1mdW5jdGlvbigpe28uX2xvYWRpbmc9ITEsaC5ydW5uaW5nPSExLGYuYm9vdHN0cmFwcGVkPSEwLHUuX2Jvb3RzdHJhcHBpbmc9ITEsby5fYXR0YWNoKFsibG9hZGVyIl0pJiZvLl91c2UoZSx0KX0sdS5fYm9vdHN0cmFwcGluZz9oLmFkZChzKToodS5fYm9vdHN0cmFwcGluZz0hMCxvLkdldC5zY3JpcHQodi5iYXNlK3YubG9hZGVyUGF0aCx7b25FbmQ6c30pKSk6KHc9by5fYXR0YWNoKGUpLHcmJlQoKSksb30sbmFtZXNwYWNlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLHQsbj0wLGkscyxvO2Zvcig7bjxlLmxlbmd0aDtuKyspe3Q9dGhpcyxvPWVbbl07aWYoby5pbmRleE9mKHIpPi0xKXtzPW8uc3BsaXQocik7Zm9yKGk9c1swXT09IllBSE9PIj8xOjA7aTxzLmxlbmd0aDtpKyspdFtzW2ldXT10W3NbaV1dfHx7fSx0PXRbc1tpXV19ZWxzZSB0W29dPXRbb118fHt9LHQ9dFtvXX1yZXR1cm4gdH0sbG9nOnUsbWVzc2FnZTp1LGR1bXA6ZnVuY3Rpb24oZSl7cmV0dXJuIiIrZX0sZXJyb3I6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMsaTtyLmNvbmZpZy5lcnJvckZuJiYoaT1yLmNvbmZpZy5lcnJvckZuLmFwcGx5KHIsYXJndW1lbnRzKSk7aWYoIWkpdGhyb3cgdHx8bmV3IEVycm9yKGUpO3JldHVybiByLm1lc3NhZ2UoZSwiZXJyb3IiLCIiK24pLHJ9LGd1aWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5FbnYuX2d1aWRwKyJfIisgKyt0aGlzLkVudi5fdWlkeDtyZXR1cm4gZT9lK3Q6dH0sc3RhbXA6ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZighZSlyZXR1cm4gZTtlLnVuaXF1ZUlEJiZlLm5vZGVUeXBlJiZlLm5vZGVUeXBlIT09OT9uPWUudW5pcXVlSUQ6bj10eXBlb2YgZT09InN0cmluZyI/ZTplLl95dWlkO2lmKCFuKXtuPXRoaXMuZ3VpZCgpO2lmKCF0KXRyeXtlLl95dWlkPW59Y2F0Y2gocil7bj1udWxsfX1yZXR1cm4gbn0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5FdmVudCYmZS5FdmVudC5fdW5sb2FkKCksZGVsZXRlIHZbZS5pZF0sZGVsZXRlIGUuRW52LGRlbGV0ZSBlLmNvbmZpZ319LFlVSS5wcm90b3R5cGU9ZTtmb3IodCBpbiBlKWUuaGFzT3duUHJvcGVydHkodCkmJihZVUlbdF09ZVt0XSk7WVVJLmFwcGx5Q29uZmlnPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybjtZVUkuR2xvYmFsQ29uZmlnJiZ0aGlzLnByb3RvdHlwZS5hcHBseUNvbmZpZy5jYWxsKHRoaXMsWVVJLkdsb2JhbENvbmZpZyksdGhpcy5wcm90b3R5cGUuYXBwbHlDb25maWcuY2FsbCh0aGlzLGUpLFlVSS5HbG9iYWxDb25maWc9dGhpcy5jb25maWd9LFlVSS5faW5pdCgpLGw/KGcoaCwiRE9NQ29udGVudExvYWRlZCIsYiksZyh3aW5kb3csImxvYWQiLHcpKTooYigpLHcoKSksWVVJLkVudi5hZGQ9ZyxZVUkuRW52LnJlbW92ZT15LHR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmKGV4cG9ydHMuWVVJPVlVSSxZVUkuc2V0TG9hZEhvb2s9ZnVuY3Rpb24oZSl7WVVJLl9nZXRMb2FkSG9vaz1lfSxZVUkuX2dldExvYWRIb29rPW51bGwpLFlVSS5FbnZbbl09e319KSgpLFlVSS5hZGQoInl1aS1iYXNlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG0oZSx0LG4pe3ZhciByLGk7dHx8KHQ9MCk7aWYobnx8bS50ZXN0KGUpKXRyeXtyZXR1cm4gZC5zbGljZS5jYWxsKGUsdCl9Y2F0Y2gocyl7aT1bXTtmb3Iocj1lLmxlbmd0aDt0PHI7Kyt0KWkucHVzaChlW3RdKTtyZXR1cm4gaX1yZXR1cm5bZV19ZnVuY3Rpb24gZygpe3RoaXMuX2luaXQoKSx0aGlzLmFkZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIG49ZS5MYW5nfHwoZS5MYW5nPXt9KSxyPVN0cmluZy5wcm90b3R5cGUsaT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHM9eyJ1bmRlZmluZWQiOiJ1bmRlZmluZWQiLG51bWJlcjoibnVtYmVyIiwiYm9vbGVhbiI6ImJvb2xlYW4iLHN0cmluZzoic3RyaW5nIiwiW29iamVjdCBGdW5jdGlvbl0iOiJmdW5jdGlvbiIsIltvYmplY3QgUmVnRXhwXSI6InJlZ2V4cCIsIltvYmplY3QgQXJyYXldIjoiYXJyYXkiLCJbb2JqZWN0IERhdGVdIjoiZGF0ZSIsIltvYmplY3QgRXJyb3JdIjoiZXJyb3IifSxvPS9ce1xzKihbXnx9XSs/KVxzKig/Olx8KFtefV0qKSk/XHMqXH0vZyx1PSIJXG4LXGZcciBcdTAwYTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMjhcdTIwMjlcdTIwMmZcdTIwNWZcdTMwMDBcdWZlZmYiLGE9IlsJLVxyIFx1MDBhMFx1MTY4MFx1MTgwZVx1MjAwMC1cdTIwMGFcdTIwMjhcdTIwMjlcdTIwMmZcdTIwNWZcdTMwMDBcdWZlZmZdKyIsZj1uZXcgUmVnRXhwKCJeIithKSxsPW5ldyBSZWdFeHAoYSsiJCIpLGM9bmV3IFJlZ0V4cChmLnNvdXJjZSsifCIrbC5zb3VyY2UsImciKSxoPS9ce1xzKlxbKD86bmF0aXZlIGNvZGV8ZnVuY3Rpb24pXF1ccypcfS9pO24uX2lzTmF0aXZlPWZ1bmN0aW9uKHQpe3JldHVybiEhKGUuY29uZmlnLnVzZU5hdGl2ZUVTNSYmdCYmaC50ZXN0KHQpKX0sbi5pc0FycmF5PW4uX2lzTmF0aXZlKEFycmF5LmlzQXJyYXkpP0FycmF5LmlzQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIG4udHlwZShlKT09PSJhcnJheSJ9LG4uaXNCb29sZWFuPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09ImJvb2xlYW4ifSxuLmlzRGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbi50eXBlKGUpPT09ImRhdGUiJiZlLnRvU3RyaW5nKCkhPT0iSW52YWxpZCBEYXRlIiYmIWlzTmFOKGUpfSxuLmlzRnVuY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuIG4udHlwZShlKT09PSJmdW5jdGlvbiJ9LG4uaXNOdWxsPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09bnVsbH0sbi5pc051bWJlcj1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJudW1iZXIiJiZpc0Zpbml0ZShlKX0sbi5pc09iamVjdD1mdW5jdGlvbihlLHQpe3ZhciByPXR5cGVvZiBlO3JldHVybiBlJiYocj09PSJvYmplY3QifHwhdCYmKHI9PT0iZnVuY3Rpb24ifHwKbi5pc0Z1bmN0aW9uKGUpKSl8fCExfSxuLmlzUmVnRXhwPWZ1bmN0aW9uKGUpe3JldHVybiBuLnR5cGUoZSk9PT0icmVnZXhwIn0sbi5pc1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmcifSxuLmlzVW5kZWZpbmVkPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09InVuZGVmaW5lZCJ9LG4uaXNWYWx1ZT1mdW5jdGlvbihlKXt2YXIgdD1uLnR5cGUoZSk7c3dpdGNoKHQpe2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUoZSk7Y2FzZSJudWxsIjpjYXNlInVuZGVmaW5lZCI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hIXR9fSxuLm5vdz1EYXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sbi5zdWI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5yZXBsYWNlP2UucmVwbGFjZShvLGZ1bmN0aW9uKGUscil7cmV0dXJuIG4uaXNVbmRlZmluZWQodFtyXSk/ZTp0W3JdfSk6ZX0sbi50cmltPW4uX2lzTmF0aXZlKHIudHJpbSkmJiF1LnRyaW0oKT9mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS50cmltP2UudHJpbSgpOmV9OmZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gZS5yZXBsYWNlKGMsIiIpfWNhdGNoKHQpe3JldHVybiBlfX0sbi50cmltTGVmdD1uLl9pc05hdGl2ZShyLnRyaW1MZWZ0KSYmIXUudHJpbUxlZnQoKT9mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltTGVmdCgpfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGYsIiIpfSxuLnRyaW1SaWdodD1uLl9pc05hdGl2ZShyLnRyaW1SaWdodCkmJiF1LnRyaW1SaWdodCgpP2Z1bmN0aW9uKGUpe3JldHVybiBlLnRyaW1SaWdodCgpfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGwsIiIpfSxuLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHNbdHlwZW9mIGVdfHxzW2kuY2FsbChlKV18fChlPyJvYmplY3QiOiJudWxsIil9O3ZhciBwPWUuTGFuZyxkPUFycmF5LnByb3RvdHlwZSx2PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZS5BcnJheT1tLG0uZGVkdXBlPXAuX2lzTmF0aXZlKE9iamVjdC5jcmVhdGUpP2Z1bmN0aW9uKGUpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCksbj1bXSxyLGkscztmb3Iocj0wLHM9ZS5sZW5ndGg7cjxzOysrcilpPWVbcl0sdFtpXXx8KHRbaV09MSxuLnB1c2goaSkpO3JldHVybiBufTpmdW5jdGlvbihlKXt2YXIgdD17fSxuPVtdLHIsaSxzO2ZvcihyPTAscz1lLmxlbmd0aDtyPHM7KytyKWk9ZVtyXSx2LmNhbGwodCxpKXx8KHRbaV09MSxuLnB1c2goaSkpO3JldHVybiBufSxtLmVhY2g9bS5mb3JFYWNoPXAuX2lzTmF0aXZlKGQuZm9yRWFjaCk/ZnVuY3Rpb24odCxuLHIpe3JldHVybiBkLmZvckVhY2guY2FsbCh0fHxbXSxuLHJ8fGUpLGV9OmZ1bmN0aW9uKHQsbixyKXtmb3IodmFyIGk9MCxzPXQmJnQubGVuZ3RofHwwO2k8czsrK2kpaSBpbiB0JiZuLmNhbGwocnx8ZSx0W2ldLGksdCk7cmV0dXJuIGV9LG0uaGFzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXt9LHI9dCYmdC5sZW5ndGh8fDAsaSxzO2ZvcihpPTAscz1lLmxlbmd0aDtpPHM7KytpKWkgaW4gZSYmKG5bZVtpXV09cj5pJiZpIGluIHQ/dFtpXTohMCk7cmV0dXJuIG59LG0uaW5kZXhPZj1wLl9pc05hdGl2ZShkLmluZGV4T2YpP2Z1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZC5pbmRleE9mLmNhbGwoZSx0LG4pfTpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5sZW5ndGg7bj0rbnx8MCxuPShuPjB8fC0xKSpNYXRoLmZsb29yKE1hdGguYWJzKG4pKSxuPDAmJihuKz1yLG48MCYmKG49MCkpO2Zvcig7bjxyOysrbilpZihuIGluIGUmJmVbbl09PT10KXJldHVybiBuO3JldHVybi0xfSxtLm51bWVyaWNTb3J0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0sbS5zb21lPXAuX2lzTmF0aXZlKGQuc29tZSk/ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBkLnNvbWUuY2FsbChlLHQsbil9OmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPWUubGVuZ3RoO3I8aTsrK3IpaWYociBpbiBlJiZ0LmNhbGwobixlW3JdLHIsZSkpcmV0dXJuITA7cmV0dXJuITF9LG0udGVzdD1mdW5jdGlvbihlKXt2YXIgdD0wO2lmKHAuaXNBcnJheShlKSl0PTE7ZWxzZSBpZihwLmlzT2JqZWN0KGUpKXRyeXsibGVuZ3RoImluIGUmJiFlLnRhZ05hbWUmJighZS5zY3JvbGxUb3x8IWUuZG9jdW1lbnQpJiYhZS5hcHBseSYmKHQ9Mil9Y2F0Y2gobil7fXJldHVybiB0fSxnLnByb3RvdHlwZT17X2luaXQ6ZnVuY3Rpb24oKXt0aGlzLl9xPVtdfSxuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Euc2hpZnQoKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9xLnBvcCgpfSxhZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcS5wdXNoLmFwcGx5KHRoaXMuX3EsYXJndW1lbnRzKSx0aGlzfSxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3EubGVuZ3RofX0sZS5RdWV1ZT1nLFlVSS5FbnYuX2xvYWRlclF1ZXVlPVlVSS5FbnYuX2xvYWRlclF1ZXVlfHxuZXcgZzt2YXIgeT0iX18iLHY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxiPWUuTGFuZy5pc09iamVjdDtlLmNhY2hlZD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHR8fCh0PXt9KSxmdW5jdGlvbihyKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjE/QXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMseSk6U3RyaW5nKHIpO2lmKCEoaSBpbiB0KXx8biYmdFtpXT09bil0W2ldPWUuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiB0W2ldfX0sZS5nZXRMb2NhdGlvbj1mdW5jdGlvbigpe3ZhciB0PWUuY29uZmlnLndpbjtyZXR1cm4gdCYmdC5sb2NhdGlvbn0sZS5tZXJnZT1mdW5jdGlvbigpe3ZhciBlPTAsdD1hcmd1bWVudHMubGVuZ3RoLG49e30scixpO2Zvcig7ZTx0OysrZSl7aT1hcmd1bWVudHNbZV07Zm9yKHIgaW4gaSl2LmNhbGwoaSxyKSYmKG5bcl09aVtyXSl9cmV0dXJuIG59LGUubWl4PWZ1bmN0aW9uKHQsbixyLGkscyxvKXt2YXIgdSxhLGYsbCxjLGgscDtpZighdHx8IW4pcmV0dXJuIHR8fGU7aWYocyl7cz09PTImJmUubWl4KHQucHJvdG90eXBlLG4ucHJvdG90eXBlLHIsaSwwLG8pLGY9cz09PTF8fHM9PT0zP24ucHJvdG90eXBlOm4scD1zPT09MXx8cz09PTQ/dC5wcm90b3R5cGU6dDtpZighZnx8IXApcmV0dXJuIHR9ZWxzZSBmPW4scD10O3U9ciYmIW87aWYoaSlmb3IobD0wLGg9aS5sZW5ndGg7bDxoOysrbCl7Yz1pW2xdO2lmKCF2LmNhbGwoZixjKSljb250aW51ZTthPXU/ITE6YyBpbiBwO2lmKG8mJmEmJmIocFtjXSwhMCkmJmIoZltjXSwhMCkpZS5taXgocFtjXSxmW2NdLHIsbnVsbCwwLG8pO2Vsc2UgaWYocnx8IWEpcFtjXT1mW2NdfWVsc2V7Zm9yKGMgaW4gZil7aWYoIXYuY2FsbChmLGMpKWNvbnRpbnVlO2E9dT8hMTpjIGluIHA7aWYobyYmYSYmYihwW2NdLCEwKSYmYihmW2NdLCEwKSllLm1peChwW2NdLGZbY10scixudWxsLDAsbyk7ZWxzZSBpZihyfHwhYSlwW2NdPWZbY119ZS5PYmplY3QuX2hhc0VudW1CdWcmJmUubWl4KHAsZixyLGUuT2JqZWN0Ll9mb3JjZUVudW0scyxvKX1yZXR1cm4gdH07dmFyIHA9ZS5MYW5nLHY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx3LEU9ZS5PYmplY3Q9cC5faXNOYXRpdmUoT2JqZWN0LmNyZWF0ZSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5jcmVhdGUoZSl9OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucHJvdG90eXBlPXQsbmV3IGV9fSgpLFM9RS5fZm9yY2VFbnVtPVsiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJ0b1N0cmluZyIsInRvTG9jYWxlU3RyaW5nIiwidmFsdWVPZiJdLHg9RS5faGFzRW51bUJ1Zz0he3ZhbHVlT2Y6MH0ucHJvcGVydHlJc0VudW1lcmFibGUoInZhbHVlT2YiKSxUPUUuX2hhc1Byb3RvRW51bUJ1Zz1mdW5jdGlvbigpe30ucHJvcGVydHlJc0VudW1lcmFibGUoInByb3RvdHlwZSIpLE49RS5vd25zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuISFlJiZ2LmNhbGwoZSx0KX07RS5oYXNLZXk9TixFLmtleXM9cC5faXNOYXRpdmUoT2JqZWN0LmtleXMpJiYhVD9PYmplY3Qua2V5czpmdW5jdGlvbihlKXtpZighcC5pc09iamVjdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Iik7dmFyIHQ9W10sbixyLGk7aWYoVCYmdHlwZW9mIGU9PSJmdW5jdGlvbiIpZm9yKHIgaW4gZSlOKGUscikmJnIhPT0icHJvdG90eXBlIiYmdC5wdXNoKHIpO2Vsc2UgZm9yKHIgaW4gZSlOKGUscikmJnQucHVzaChyKTtpZih4KWZvcihuPTAsaT1TLmxlbmd0aDtuPGk7KytuKXI9U1tuXSxOKGUscikmJnQucHVzaChyKTtyZXR1cm4gdH0sRS52YWx1ZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9RS5rZXlzKGUpLG49MCxyPXQubGVuZ3RoLGk9W107Zm9yKDtuPHI7KytuKWkucHVzaChlW3Rbbl1dKTtyZXR1cm4gaX0sRS5zaXplPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gRS5rZXlzKGUpLmxlbmd0aH1jYXRjaCh0KXtyZXR1cm4gMH19LEUuaGFzVmFsdWU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5BcnJheS5pbmRleE9mKEUudmFsdWVzKHQpLG4pPi0xfSxFLmVhY2g9ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM7Zm9yKHMgaW4gdCkoaXx8Tih0LHMpKSYmbi5jYWxsKHJ8fGUsdFtzXSxzLHQpO3JldHVybiBlfSxFLnNvbWU9ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM7Zm9yKHMgaW4gdClpZihpfHxOKHQscykpaWYobi5jYWxsKHJ8fGUsdFtzXSxzLHQpKXJldHVybiEwO3JldHVybiExfSxFLmdldFZhbHVlPWZ1bmN0aW9uKHQsbil7aWYoIXAuaXNPYmplY3QodCkpcmV0dXJuIHc7dmFyIHIsaT1lLkFycmF5KG4pLHM9aS5sZW5ndGg7Zm9yKHI9MDt0IT09dyYmcjxzO3IrKyl0PXRbaVtyXV07cmV0dXJuIHR9LEUuc2V0VmFsdWU9ZnVuY3Rpb24odCxuLHIpe3ZhciBpLHM9ZS5BcnJheShuKSxvPXMubGVuZ3RoLTEsdT10O2lmKG8+PTApe2ZvcihpPTA7dSE9PXcmJmk8bztpKyspdT11W3NbaV1dO2lmKHU9PT13KXJldHVybiB3O3Vbc1tpXV09cn1yZXR1cm4gdH0sRS5pc0VtcHR5PWZ1bmN0aW9uKGUpe3JldHVybiFFLmtleXMoT2JqZWN0KGUpKS5sZW5ndGh9LFlVSS5FbnYucGFyc2VVQT1mdW5jdGlvbih0KXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD0wO3JldHVybiBwYXJzZUZsb2F0KGUucmVwbGFjZSgvXC4vZyxmdW5jdGlvbigpe3JldHVybiB0Kys9PT0xPyIiOiIuIn0pKX0scj1lLmNvbmZpZy53aW4saT1yJiZyLm5hdmlnYXRvcixzPXtpZTowLG9wZXJhOjAsZ2Vja286MCx3ZWJraXQ6MCxzYWZhcmk6MCxjaHJvbWU6MCxtb2JpbGU6bnVsbCxhaXI6MCxwaGFudG9tanM6MCxpcGFkOjAsaXBob25lOjAsaXBvZDowLGlvczpudWxsLGFuZHJvaWQ6MCxzaWxrOjAsdWJ1bnR1OjAsYWNjZWw6ITEsd2Vib3M6MCxjYWphOmkmJmkuY2FqYVZlcnNpb24sc2VjdXJlOiExLG9zOm51bGwsbm9kZWpzOjAsd2luanM6dHlwZW9mIFdpbmRvd3MhPSJ1bmRlZmluZWQiJiYhIVdpbmRvd3MuU3lzdGVtLHRvdWNoRW5hYmxlZDohMX0sbz10fHxpJiZpLnVzZXJBZ2VudCx1PXImJnIubG9jYXRpb24sYT11JiZ1LmhyZWYsZjtyZXR1cm4gcy51c2VyQWdlbnQ9byxzLnNlY3VyZT1hJiZhLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHMiKT09PTAsbyYmKC93aW5kb3dzfHdpbjMyL2kudGVzdChvKT9zLm9zPSJ3aW5kb3dzIjovbWFjaW50b3NofG1hY19wb3dlcnBjL2kudGVzdChvKT9zLm9zPSJtYWNpbnRvc2giOi9hbmRyb2lkL2kudGVzdChvKT9zLm9zPSJhbmRyb2lkIjovc3ltYm9zL2kudGVzdChvKT9zLm9zPSJzeW1ib3MiOi9saW51eC9pLnRlc3Qobyk/cy5vcz0ibGludXgiOi9yaGluby9pLnRlc3QobykmJihzLm9zPSJyaGlubyIpLC9LSFRNTC8udGVzdChvKSYmKHMud2Via2l0PTEpLC9JRU1vYmlsZXxYQkxXUDcvLnRlc3QobykmJihzLm1vYmlsZT0id2luZG93cyIpLC9GZW5uZWMvLnRlc3QobykmJihzLm1vYmlsZT0iZ2Vja28iKSxmPW8ubWF0Y2goL0FwcGxlV2ViS2l0XC8oW15cc10qKS8pLGYmJmZbMV0mJihzLgp3ZWJraXQ9bihmWzFdKSxzLnNhZmFyaT1zLndlYmtpdCwvUGhhbnRvbUpTLy50ZXN0KG8pJiYoZj1vLm1hdGNoKC9QaGFudG9tSlNcLyhbXlxzXSopLyksZiYmZlsxXSYmKHMucGhhbnRvbWpzPW4oZlsxXSkpKSwvIE1vYmlsZVwvLy50ZXN0KG8pfHwvaVBhZHxpUG9kfGlQaG9uZS8udGVzdChvKT8ocy5tb2JpbGU9IkFwcGxlIixmPW8ubWF0Y2goL09TIChbXlxzXSopLyksZiYmZlsxXSYmKGY9bihmWzFdLnJlcGxhY2UoIl8iLCIuIikpKSxzLmlvcz1mLHMub3M9ImlvcyIscy5pcGFkPXMuaXBvZD1zLmlwaG9uZT0wLGY9by5tYXRjaCgvaVBhZHxpUG9kfGlQaG9uZS8pLGYmJmZbMF0mJihzW2ZbMF0udG9Mb3dlckNhc2UoKV09cy5pb3MpKTooZj1vLm1hdGNoKC9Ob2tpYU5bXlwvXSp8d2ViT1NcL1xkXC5cZC8pLGYmJihzLm1vYmlsZT1mWzBdKSwvd2ViT1MvLnRlc3QobykmJihzLm1vYmlsZT0iV2ViT1MiLGY9by5tYXRjaCgvd2ViT1NcLyhbXlxzXSopOy8pLGYmJmZbMV0mJihzLndlYm9zPW4oZlsxXSkpKSwvIEFuZHJvaWQvLnRlc3QobykmJigvTW9iaWxlLy50ZXN0KG8pJiYocy5tb2JpbGU9IkFuZHJvaWQiKSxmPW8ubWF0Y2goL0FuZHJvaWQgKFteXHNdKik7LyksZiYmZlsxXSYmKHMuYW5kcm9pZD1uKGZbMV0pKSksL1NpbGsvLnRlc3QobykmJihmPW8ubWF0Y2goL1NpbGtcLyhbXlxzXSopLyksZiYmZlsxXSYmKHMuc2lsaz1uKGZbMV0pKSxzLmFuZHJvaWR8fChzLmFuZHJvaWQ9Mi4zNCxzLm9zPSJBbmRyb2lkIiksL0FjY2VsZXJhdGVkPXRydWUvLnRlc3QobykmJihzLmFjY2VsPSEwKSkpLGY9by5tYXRjaCgvT1BSXC8oXGQrXC5cZCspLyksZiYmZlsxXT9zLm9wZXJhPW4oZlsxXSk6KGY9by5tYXRjaCgvKENocm9tZXxDck1vfENyaU9TKVwvKFteXHNdKikvKSxmJiZmWzFdJiZmWzJdPyhzLmNocm9tZT1uKGZbMl0pLHMuc2FmYXJpPTAsZlsxXT09PSJDck1vIiYmKHMubW9iaWxlPSJjaHJvbWUiKSk6KGY9by5tYXRjaCgvQWRvYmVBSVJcLyhbXlxzXSopLyksZiYmKHMuYWlyPWZbMF0pKSkpLGY9by5tYXRjaCgvVWJ1bnR1XCAoXGQrXC5cZCspLyksZiYmZlsxXSYmKHMub3M9ImxpbnV4IixzLnVidW50dT1uKGZbMV0pLGY9by5tYXRjaCgvXCBXZWJLaXRcLyhbXlxzXSopLyksZiYmZlsxXSYmKHMud2Via2l0PW4oZlsxXSkpLGY9by5tYXRjaCgvXCBDaHJvbWl1bVwvKFteXHNdKikvKSxmJiZmWzFdJiYocy5jaHJvbWU9bihmWzFdKSksLyBNb2JpbGUkLy50ZXN0KG8pJiYocy5tb2JpbGU9IlVidW50dSIpKSxzLndlYmtpdHx8KC9PcGVyYS8udGVzdChvKT8oZj1vLm1hdGNoKC9PcGVyYVtcc1wvXShbXlxzXSopLyksZiYmZlsxXSYmKHMub3BlcmE9bihmWzFdKSksZj1vLm1hdGNoKC9WZXJzaW9uXC8oW15cc10qKS8pLGYmJmZbMV0mJihzLm9wZXJhPW4oZlsxXSkpLC9PcGVyYSBNb2JpLy50ZXN0KG8pJiYocy5tb2JpbGU9Im9wZXJhIixmPW8ucmVwbGFjZSgiT3BlcmEgTW9iaSIsIiIpLm1hdGNoKC9PcGVyYSAoW15cc10qKS8pLGYmJmZbMV0mJihzLm9wZXJhPW4oZlsxXSkpKSxmPW8ubWF0Y2goL09wZXJhIE1pbmlbXjtdKi8pLGYmJihzLm1vYmlsZT1mWzBdKSk6KGY9by5tYXRjaCgvTVNJRSAoW147XSopfFRyaWRlbnQuKjsgcnY6KFswLTkuXSspLyksZiYmKGZbMV18fGZbMl0pP3MuaWU9bihmWzFdfHxmWzJdKTooZj1vLm1hdGNoKC9HZWNrb1wvKFteXHNdKikvKSxmJiYocy5nZWNrbz0xLGY9by5tYXRjaCgvcnY6KFteXHNcKV0qKS8pLGYmJmZbMV0mJihzLmdlY2tvPW4oZlsxXSksL01vYmlsZXxUYWJsZXQvLnRlc3QobykmJihzLm1vYmlsZT0iZmZvcyIpKSkpKSkpLHImJmkmJiEocy5jaHJvbWUmJnMuY2hyb21lPDYpJiYocy50b3VjaEVuYWJsZWQ9Im9udG91Y2hzdGFydCJpbiByfHwibXNNYXhUb3VjaFBvaW50cyJpbiBpJiZpLm1zTWF4VG91Y2hQb2ludHM+MCksdHx8KHR5cGVvZiBwcm9jZXNzPT0ib2JqZWN0IiYmcHJvY2Vzcy52ZXJzaW9ucyYmcHJvY2Vzcy52ZXJzaW9ucy5ub2RlJiYocy5vcz1wcm9jZXNzLnBsYXRmb3JtLHMubm9kZWpzPW4ocHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSksWVVJLkVudi5VQT1zKSxzfSxlLlVBPVlVSS5FbnYuVUF8fFlVSS5FbnYucGFyc2VVQSgpLGUuVUEuY29tcGFyZVZlcnNpb25zPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbyx1O2lmKGU9PT10KXJldHVybiAwO3I9KGUrIiIpLnNwbGl0KCIuIikscz0odCsiIikuc3BsaXQoIi4iKTtmb3Iobz0wLHU9TWF0aC5tYXgoci5sZW5ndGgscy5sZW5ndGgpO288dTsrK28pe249cGFyc2VJbnQocltvXSwxMCksaT1wYXJzZUludChzW29dLDEwKSxpc05hTihuKSYmKG49MCksaXNOYU4oaSkmJihpPTApO2lmKG48aSlyZXR1cm4tMTtpZihuPmkpcmV0dXJuIDF9cmV0dXJuIDB9LFlVSS5FbnYuYWxpYXNlcz17YW5pbTpbImFuaW0tYmFzZSIsImFuaW0tY29sb3IiLCJhbmltLWN1cnZlIiwiYW5pbS1lYXNpbmciLCJhbmltLW5vZGUtcGx1Z2luIiwiYW5pbS1zY3JvbGwiLCJhbmltLXh5Il0sImFuaW0tc2hhcGUtdHJhbnNmb3JtIjpbImFuaW0tc2hhcGUiXSxhcHA6WyJhcHAtYmFzZSIsImFwcC1jb250ZW50IiwiYXBwLXRyYW5zaXRpb25zIiwibGF6eS1tb2RlbC1saXN0IiwibW9kZWwiLCJtb2RlbC1saXN0IiwibW9kZWwtc3luYy1yZXN0IiwibW9kZWwtc3luYy1sb2NhbCIsInJvdXRlciIsInZpZXciLCJ2aWV3LW5vZGUtbWFwIl0sYXR0cmlidXRlOlsiYXR0cmlidXRlLWJhc2UiLCJhdHRyaWJ1dGUtY29tcGxleCJdLCJhdHRyaWJ1dGUtZXZlbnRzIjpbImF0dHJpYnV0ZS1vYnNlcnZhYmxlIl0sYXV0b2NvbXBsZXRlOlsiYXV0b2NvbXBsZXRlLWJhc2UiLCJhdXRvY29tcGxldGUtc291cmNlcyIsImF1dG9jb21wbGV0ZS1saXN0IiwiYXV0b2NvbXBsZXRlLXBsdWdpbiJdLGF4ZXM6WyJheGlzLW51bWVyaWMiLCJheGlzLWNhdGVnb3J5IiwiYXhpcy10aW1lIiwiYXhpcy1zdGFja2VkIl0sImF4ZXMtYmFzZSI6WyJheGlzLW51bWVyaWMtYmFzZSIsImF4aXMtY2F0ZWdvcnktYmFzZSIsImF4aXMtdGltZS1iYXNlIiwiYXhpcy1zdGFja2VkLWJhc2UiXSxiYXNlOlsiYmFzZS1iYXNlIiwiYmFzZS1wbHVnaW5ob3N0IiwiYmFzZS1idWlsZCJdLGNhY2hlOlsiY2FjaGUtYmFzZSIsImNhY2hlLW9mZmxpbmUiLCJjYWNoZS1wbHVnaW4iXSxjaGFydHM6WyJjaGFydHMtYmFzZSJdLGNvbGxlY3Rpb246WyJhcnJheS1leHRyYXMiLCJhcnJheWxpc3QiLCJhcnJheWxpc3QtYWRkIiwiYXJyYXlsaXN0LWZpbHRlciIsImFycmF5LWludm9rZSJdLGNvbG9yOlsiY29sb3ItYmFzZSIsImNvbG9yLWhzbCIsImNvbG9yLWhhcm1vbnkiXSxjb250cm9sbGVyOlsicm91dGVyIl0sZGF0YXNjaGVtYTpbImRhdGFzY2hlbWEtYmFzZSIsImRhdGFzY2hlbWEtanNvbiIsImRhdGFzY2hlbWEteG1sIiwiZGF0YXNjaGVtYS1hcnJheSIsImRhdGFzY2hlbWEtdGV4dCJdLGRhdGFzb3VyY2U6WyJkYXRhc291cmNlLWxvY2FsIiwiZGF0YXNvdXJjZS1pbyIsImRhdGFzb3VyY2UtZ2V0IiwiZGF0YXNvdXJjZS1mdW5jdGlvbiIsImRhdGFzb3VyY2UtY2FjaGUiLCJkYXRhc291cmNlLWpzb25zY2hlbWEiLCJkYXRhc291cmNlLXhtbHNjaGVtYSIsImRhdGFzb3VyY2UtYXJyYXlzY2hlbWEiLCJkYXRhc291cmNlLXRleHRzY2hlbWEiLCJkYXRhc291cmNlLXBvbGxpbmciXSxkYXRhdGFibGU6WyJkYXRhdGFibGUtY29yZSIsImRhdGF0YWJsZS10YWJsZSIsImRhdGF0YWJsZS1oZWFkIiwiZGF0YXRhYmxlLWJvZHkiLCJkYXRhdGFibGUtYmFzZSIsImRhdGF0YWJsZS1jb2x1bW4td2lkdGhzIiwiZGF0YXRhYmxlLW1lc3NhZ2UiLCJkYXRhdGFibGUtbXV0YWJsZSIsImRhdGF0YWJsZS1zb3J0IiwiZGF0YXRhYmxlLWRhdGFzb3VyY2UiXSxkYXRhdHlwZTpbImRhdGF0eXBlLWRhdGUiLCJkYXRhdHlwZS1udW1iZXIiLCJkYXRhdHlwZS14bWwiXSwiZGF0YXR5cGUtZGF0ZSI6WyJkYXRhdHlwZS1kYXRlLXBhcnNlIiwiZGF0YXR5cGUtZGF0ZS1mb3JtYXQiLCJkYXRhdHlwZS1kYXRlLW1hdGgiXSwiZGF0YXR5cGUtbnVtYmVyIjpbImRhdGF0eXBlLW51bWJlci1wYXJzZSIsImRhdGF0eXBlLW51bWJlci1mb3JtYXQiXSwiZGF0YXR5cGUteG1sIjpbImRhdGF0eXBlLXhtbC1wYXJzZSIsImRhdGF0eXBlLXhtbC1mb3JtYXQiXSxkZDpbImRkLWRkbS1iYXNlIiwiZGQtZGRtIiwiZGQtZGRtLWRyb3AiLCJkZC1kcmFnIiwiZGQtcHJveHkiLCJkZC1jb25zdHJhaW4iLCJkZC1kcm9wIiwiZGQtc2Nyb2xsIiwiZGQtZGVsZWdhdGUiXSxkb206WyJkb20tYmFzZSIsImRvbS1zY3JlZW4iLCJkb20tc3R5bGUiLCJzZWxlY3Rvci1uYXRpdmUiLCJzZWxlY3RvciJdLGVkaXRvcjpbImZyYW1lIiwiZWRpdG9yLXNlbGVjdGlvbiIsImV4ZWMtY29tbWFuZCIsImVkaXRvci1iYXNlIiwiZWRpdG9yLXBhcmEiLCJlZGl0b3ItYnIiLCJlZGl0b3ItYmlkaSIsImVkaXRvci10YWIiLCJjcmVhdGVsaW5rLWJhc2UiXSxldmVudDpbImV2ZW50LWJhc2UiLCJldmVudC1kZWxlZ2F0ZSIsImV2ZW50LXN5bnRoZXRpYyIsImV2ZW50LW1vdXNld2hlZWwiLCJldmVudC1tb3VzZWVudGVyIiwiZXZlbnQta2V5IiwiZXZlbnQtZm9jdXMiLCJldmVudC1yZXNpemUiLCJldmVudC1ob3ZlciIsImV2ZW50LW91dHNpZGUiLCJldmVudC10b3VjaCIsImV2ZW50LW1vdmUiLCJldmVudC1mbGljayIsImV2ZW50LXZhbHVlY2hhbmdlIiwiZXZlbnQtdGFwIl0sImV2ZW50LWN1c3RvbSI6WyJldmVudC1jdXN0b20tYmFzZSIsImV2ZW50LWN1c3RvbS1jb21wbGV4Il0sImV2ZW50LWdlc3R1cmVzIjpbImV2ZW50LWZsaWNrIiwiZXZlbnQtbW92ZSJdLGhhbmRsZWJhcnM6WyJoYW5kbGViYXJzLWNvbXBpbGVyIl0saGlnaGxpZ2h0OlsiaGlnaGxpZ2h0LWJhc2UiLCJoaWdobGlnaHQtYWNjZW50Zm9sZCJdLGhpc3Rvcnk6WyJoaXN0b3J5LWJhc2UiLCJoaXN0b3J5LWhhc2giLCJoaXN0b3J5LWh0bWw1Il0saW86WyJpby1iYXNlIiwiaW8teGRyIiwiaW8tZm9ybSIsImlvLXVwbG9hZC1pZnJhbWUiLCJpby1xdWV1ZSJdLGpzb246WyJqc29uLXBhcnNlIiwianNvbi1zdHJpbmdpZnkiXSxsb2FkZXI6WyJsb2FkZXItYmFzZSIsImxvYWRlci1yb2xsdXAiLCJsb2FkZXIteXVpMyJdLG5vZGU6WyJub2RlLWJhc2UiLCJub2RlLWV2ZW50LWRlbGVnYXRlIiwibm9kZS1wbHVnaW5ob3N0Iiwibm9kZS1zY3JlZW4iLCJub2RlLXN0eWxlIl0scGx1Z2luaG9zdDpbInBsdWdpbmhvc3QtYmFzZSIsInBsdWdpbmhvc3QtY29uZmlnIl0scXVlcnlzdHJpbmc6WyJxdWVyeXN0cmluZy1wYXJzZSIsInF1ZXJ5c3RyaW5nLXN0cmluZ2lmeSJdLHJlY29yZHNldDpbInJlY29yZHNldC1iYXNlIiwicmVjb3Jkc2V0LXNvcnQiLCJyZWNvcmRzZXQtZmlsdGVyIiwicmVjb3Jkc2V0LWluZGV4ZXIiXSxyZXNpemU6WyJyZXNpemUtYmFzZSIsInJlc2l6ZS1wcm94eSIsInJlc2l6ZS1jb25zdHJhaW4iXSxzbGlkZXI6WyJzbGlkZXItYmFzZSIsInNsaWRlci12YWx1ZS1yYW5nZSIsImNsaWNrYWJsZS1yYWlsIiwicmFuZ2Utc2xpZGVyIl0sdGVtcGxhdGU6WyJ0ZW1wbGF0ZS1iYXNlIiwidGVtcGxhdGUtbWljcm8iXSx0ZXh0OlsidGV4dC1hY2NlbnRmb2xkIiwidGV4dC13b3JkYnJlYWsiXSx3aWRnZXQ6WyJ3aWRnZXQtYmFzZSIsIndpZGdldC1odG1scGFyc2VyIiwid2lkZ2V0LXNraW4iLCJ3aWRnZXQtdWlldmVudHMiXX19LCIzLjE3LjIiLHt1c2U6WyJ5dWktYmFzZSIsImdldCIsImZlYXR1cmVzIiwiaW50bC1iYXNlIiwieXVpLWxvZyIsInl1aS1sYXRlciIsImxvYWRlci1iYXNlIiwibG9hZGVyLXJvbGx1cCIsImxvYWRlci15dWkzIl19KSxZVUkuYWRkKCJnZXQiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5MYW5nLHIsaSxzO2UuR2V0PWk9e2Nzc09wdGlvbnM6e2F0dHJpYnV0ZXM6e3JlbDoic3R5bGVzaGVldCJ9LGRvYzplLmNvbmZpZy5saW5rRG9jfHxlLmNvbmZpZy5kb2MscG9sbEludGVydmFsOjUwfSxqc09wdGlvbnM6e2F1dG9wdXJnZTohMCxkb2M6ZS5jb25maWcuc2NyaXB0RG9jfHxlLmNvbmZpZy5kb2N9LG9wdGlvbnMKOnthdHRyaWJ1dGVzOntjaGFyc2V0OiJ1dGYtOCJ9LHB1cmdldGhyZXNob2xkOjIwfSxSRUdFWF9DU1M6L1wuY3NzKD86Wz87XS4qKT8kL2ksUkVHRVhfSlM6L1wuanMoPzpbPztdLiopPyQvaSxfaW5zZXJ0Q2FjaGU6e30sX3BlbmRpbmc6bnVsbCxfcHVyZ2VOb2RlczpbXSxfcXVldWU6W10sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGkscztpZighZS5hYm9ydCl7bj1lLHM9dGhpcy5fcGVuZGluZyxlPW51bGw7aWYocyYmcy50cmFuc2FjdGlvbi5pZD09PW4pZT1zLnRyYW5zYWN0aW9uLHRoaXMuX3BlbmRpbmc9bnVsbDtlbHNlIGZvcih0PTAsaT10aGlzLl9xdWV1ZS5sZW5ndGg7dDxpOysrdCl7cj10aGlzLl9xdWV1ZVt0XS50cmFuc2FjdGlvbjtpZihyLmlkPT09bil7ZT1yLHRoaXMuX3F1ZXVlLnNwbGljZSh0LDEpO2JyZWFrfX19ZSYmZS5hYm9ydCgpfSxjc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLl9sb2FkKCJjc3MiLGUsdCxuKX0sanM6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLl9sb2FkKCJqcyIsZSx0LG4pfSxsb2FkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fbG9hZChudWxsLGUsdCxuKX0sX2F1dG9QdXJnZTpmdW5jdGlvbihlKXtlJiZ0aGlzLl9wdXJnZU5vZGVzLmxlbmd0aD49ZSYmdGhpcy5fcHVyZ2UodGhpcy5fcHVyZ2VOb2Rlcyl9LF9nZXRFbnY6ZnVuY3Rpb24oKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj1lLlVBO3JldHVybiB0aGlzLl9lbnY9e2FzeW5jOnQmJnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IikuYXN5bmM9PT0hMHx8bi5pZT49MTAsY3NzRmFpbDpuLmdlY2tvPj05fHxuLmNvbXBhcmVWZXJzaW9ucyhuLndlYmtpdCw1MzUuMjQpPj0wLGNzc0xvYWQ6KCFuLmdlY2tvJiYhbi53ZWJraXR8fG4uZ2Vja28+PTl8fG4uY29tcGFyZVZlcnNpb25zKG4ud2Via2l0LDUzNS4yNCk+PTApJiYhKG4uY2hyb21lJiZuLmNocm9tZTw9MTgpLHByZXNlcnZlc1NjcmlwdE9yZGVyOiEhKG4uZ2Vja298fG4ub3BlcmF8fG4uaWUmJm4uaWU+PTEwKX19LF9nZXRUcmFuc2FjdGlvbjpmdW5jdGlvbih0LHIpe3ZhciBpPVtdLG8sdSxhLGY7bi5pc0FycmF5KHQpfHwodD1bdF0pLHI9ZS5tZXJnZSh0aGlzLm9wdGlvbnMsciksci5hdHRyaWJ1dGVzPWUubWVyZ2UodGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMsci5hdHRyaWJ1dGVzKTtmb3Iobz0wLHU9dC5sZW5ndGg7bzx1Oysrbyl7Zj10W29dLGE9e2F0dHJpYnV0ZXM6e319O2lmKHR5cGVvZiBmPT0ic3RyaW5nIilhLnVybD1mO2Vsc2V7aWYoIWYudXJsKWNvbnRpbnVlO2UubWl4KGEsZiwhMSxudWxsLDAsITApLGY9Zi51cmx9ZS5taXgoYSxyLCExLG51bGwsMCwhMCksYS50eXBlfHwodGhpcy5SRUdFWF9DU1MudGVzdChmKT9hLnR5cGU9ImNzcyI6KCF0aGlzLlJFR0VYX0pTLnRlc3QoZiksYS50eXBlPSJqcyIpKSxlLm1peChhLGEudHlwZT09PSJqcyI/dGhpcy5qc09wdGlvbnM6dGhpcy5jc3NPcHRpb25zLCExLG51bGwsMCwhMCksYS5hdHRyaWJ1dGVzLmlkfHwoYS5hdHRyaWJ1dGVzLmlkPWUuZ3VpZCgpKSxhLndpbj9hLmRvYz1hLndpbi5kb2N1bWVudDphLndpbj1hLmRvYy5kZWZhdWx0Vmlld3x8YS5kb2MucGFyZW50V2luZG93LGEuY2hhcnNldCYmKGEuYXR0cmlidXRlcy5jaGFyc2V0PWEuY2hhcnNldCksaS5wdXNoKGEpfXJldHVybiBuZXcgcyhpLHIpfSxfbG9hZDpmdW5jdGlvbihlLHQsbixyKXt2YXIgcztyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiImJihyPW4sbj17fSksbnx8KG49e30pLG4udHlwZT1lLG4uX29uRmluaXNoPWkuX29uVHJhbnNhY3Rpb25GaW5pc2gsdGhpcy5fZW52fHx0aGlzLl9nZXRFbnYoKSxzPXRoaXMuX2dldFRyYW5zYWN0aW9uKHQsbiksdGhpcy5fcXVldWUucHVzaCh7Y2FsbGJhY2s6cix0cmFuc2FjdGlvbjpzfSksdGhpcy5fbmV4dCgpLHN9LF9vblRyYW5zYWN0aW9uRmluaXNoOmZ1bmN0aW9uKCl7aS5fcGVuZGluZz1udWxsLGkuX25leHQoKX0sX25leHQ6ZnVuY3Rpb24oKXt2YXIgZTtpZih0aGlzLl9wZW5kaW5nKXJldHVybjtlPXRoaXMuX3F1ZXVlLnNoaWZ0KCksZSYmKHRoaXMuX3BlbmRpbmc9ZSxlLnRyYW5zYWN0aW9uLmV4ZWN1dGUoZS5jYWxsYmFjaykpfSxfcHVyZ2U6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fcHVyZ2VOb2RlcyxyPXQhPT1uLGksczt3aGlsZShzPXQucG9wKCkpe2lmKCFzLl95dWlnZXRfZmluaXNoZWQpY29udGludWU7cy5wYXJlbnROb2RlJiZzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocyksciYmKGk9ZS5BcnJheS5pbmRleE9mKG4scyksaT4tMSYmbi5zcGxpY2UoaSwxKSl9fX0saS5zY3JpcHQ9aS5qcyxpLlRyYW5zYWN0aW9uPXM9ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzO3IuaWQ9cy5fbGFzdElkKz0xLHIuZGF0YT1uLmRhdGEsci5lcnJvcnM9W10sci5ub2Rlcz1bXSxyLm9wdGlvbnM9bixyLnJlcXVlc3RzPXQsci5fY2FsbGJhY2tzPVtdLHIuX3F1ZXVlPVtdLHIuX3JlcXNXYWl0aW5nPTAsci50SWQ9ci5pZCxyLndpbj1uLndpbnx8ZS5jb25maWcud2lufSxzLl9sYXN0SWQ9MCxzLnByb3RvdHlwZT17X3N0YXRlOiJuZXciLGFib3J0OmZ1bmN0aW9uKGUpe3RoaXMuX3BlbmRpbmc9bnVsbCx0aGlzLl9wZW5kaW5nQ1NTPW51bGwsdGhpcy5fcG9sbFRpbWVyPWNsZWFyVGltZW91dCh0aGlzLl9wb2xsVGltZXIpLHRoaXMuX3F1ZXVlPVtdLHRoaXMuX3JlcXNXYWl0aW5nPTAsdGhpcy5lcnJvcnMucHVzaCh7ZXJyb3I6ZXx8IkFib3J0ZWQifSksdGhpcy5fZmluaXNoKCl9LGV4ZWN1dGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXQucmVxdWVzdHMscj10Ll9zdGF0ZSxpLHMsbyx1O2lmKHI9PT0iZG9uZSIpe2UmJmUodC5lcnJvcnMubGVuZ3RoP3QuZXJyb3JzOm51bGwsdCk7cmV0dXJufWUmJnQuX2NhbGxiYWNrcy5wdXNoKGUpO2lmKHI9PT0iZXhlY3V0aW5nIilyZXR1cm47dC5fc3RhdGU9ImV4ZWN1dGluZyIsdC5fcXVldWU9bz1bXSx0Lm9wdGlvbnMudGltZW91dCYmKHQuX3RpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3QuYWJvcnQoIlRpbWVvdXQiKX0sdC5vcHRpb25zLnRpbWVvdXQpKSx0Ll9yZXFzV2FpdGluZz1uLmxlbmd0aDtmb3IoaT0wLHM9bi5sZW5ndGg7aTxzOysraSl1PW5baV0sdS5hc3luY3x8dS50eXBlPT09ImNzcyI/dC5faW5zZXJ0KHUpOm8ucHVzaCh1KTt0Ll9uZXh0KCl9LHB1cmdlOmZ1bmN0aW9uKCl7aS5fcHVyZ2UodGhpcy5ub2Rlcyl9LF9jcmVhdGVOb2RlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1uLmNyZWF0ZUVsZW1lbnQoZSkscyxvO3J8fChvPW4uY3JlYXRlRWxlbWVudCgiZGl2Iiksby5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiYSIpLHI9by5jbGFzc05hbWU9PT0iYSI/e306eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifSk7Zm9yKHMgaW4gdCl0Lmhhc093blByb3BlcnR5KHMpJiZpLnNldEF0dHJpYnV0ZShyW3NdfHxzLHRbc10pO3JldHVybiBpfSxfZmluaXNoOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lcnJvcnMubGVuZ3RoP3RoaXMuZXJyb3JzOm51bGwsdD10aGlzLm9wdGlvbnMsbj10LmNvbnRleHR8fHRoaXMscixpLHM7aWYodGhpcy5fc3RhdGU9PT0iZG9uZSIpcmV0dXJuO3RoaXMuX3N0YXRlPSJkb25lIjtmb3IoaT0wLHM9dGhpcy5fY2FsbGJhY2tzLmxlbmd0aDtpPHM7KytpKXRoaXMuX2NhbGxiYWNrc1tpXS5jYWxsKG4sZSx0aGlzKTtyPXRoaXMuX2dldEV2ZW50RGF0YSgpLGU/KHQub25UaW1lb3V0JiZlW2UubGVuZ3RoLTFdLmVycm9yPT09IlRpbWVvdXQiJiZ0Lm9uVGltZW91dC5jYWxsKG4sciksdC5vbkZhaWx1cmUmJnQub25GYWlsdXJlLmNhbGwobixyKSk6dC5vblN1Y2Nlc3MmJnQub25TdWNjZXNzLmNhbGwobixyKSx0Lm9uRW5kJiZ0Lm9uRW5kLmNhbGwobixyKSx0Ll9vbkZpbmlzaCYmdC5fb25GaW5pc2goKX0sX2dldEV2ZW50RGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gdD9lLm1lcmdlKHRoaXMse2Fib3J0OnRoaXMuYWJvcnQscHVyZ2U6dGhpcy5wdXJnZSxyZXF1ZXN0OnQsdXJsOnQudXJsLHdpbjp0Lndpbn0pOnRoaXN9LF9nZXRJbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCl7dmFyIG49dC5kb2Mscj10Lmluc2VydEJlZm9yZSxzLG87cmV0dXJuIHI/dHlwZW9mIHI9PSJzdHJpbmciP24uZ2V0RWxlbWVudEJ5SWQocik6cjoocz1pLl9pbnNlcnRDYWNoZSxvPWUuc3RhbXAobiksKHI9c1tvXSk/cjoocj1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIilbMF0pP3Nbb109cjoocj1uLmhlYWR8fG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSxyPyhyLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoIiIpKSxzW29dPXIubGFzdENoaWxkKTpzW29dPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpWzBdKSl9LF9pbnNlcnQ6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gYygpe3UuX3Byb2dyZXNzKCJGYWlsZWQgdG8gbG9hZCAiK3QudXJsLHQpfWZ1bmN0aW9uIGgoKXtmJiZjbGVhclRpbWVvdXQoZiksdS5fcHJvZ3Jlc3MobnVsbCx0KX12YXIgbj1pLl9lbnYscj10aGlzLl9nZXRJbnNlcnRCZWZvcmUodCkscz10LnR5cGU9PT0ianMiLG89dC5ub2RlLHU9dGhpcyxhPWUuVUEsZixsO298fChzP2w9InNjcmlwdCI6IW4uY3NzTG9hZCYmYS5nZWNrbz9sPSJzdHlsZSI6bD0ibGluayIsbz10Lm5vZGU9dGhpcy5fY3JlYXRlTm9kZShsLHQuYXR0cmlidXRlcyx0LmRvYykpLHM/KG8uc2V0QXR0cmlidXRlKCJzcmMiLHQudXJsKSx0LmFzeW5jP28uYXN5bmM9ITA6KG4uYXN5bmMmJihvLmFzeW5jPSExKSxuLnByZXNlcnZlc1NjcmlwdE9yZGVyfHwodGhpcy5fcGVuZGluZz10KSkpOiFuLmNzc0xvYWQmJmEuZ2Vja28/by5pbm5lckhUTUw9KHQuYXR0cmlidXRlcy5jaGFyc2V0PydAY2hhcnNldCAiJyt0LmF0dHJpYnV0ZXMuY2hhcnNldCsnIjsnOiIiKSsnQGltcG9ydCAiJyt0LnVybCsnIjsnOm8uc2V0QXR0cmlidXRlKCJocmVmIix0LnVybCkscyYmYS5pZSYmKGEuaWU8OXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlJiZkb2N1bWVudC5kb2N1bWVudE1vZGU8OSk/by5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXsvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KG8ucmVhZHlTdGF0ZSkmJihvLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGgoKSl9OiFzJiYhbi5jc3NMb2FkP3RoaXMuX3BvbGwodCk6KGEuaWU+PTEwPyhvLm9uZXJyb3I9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGMsMCl9LG8ub25sb2FkPWZ1bmN0aW9uKCl7c2V0VGltZW91dChoLDApfSk6KG8ub25lcnJvcj1jLG8ub25sb2FkPWgpLCFuLmNzc0ZhaWwmJiFzJiYoZj1zZXRUaW1lb3V0KGMsdC50aW1lb3V0fHwzZTMpKSksdGhpcy5ub2Rlcy5wdXNoKG8pLHIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobyxyKX0sX25leHQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9wZW5kaW5nKXJldHVybjt0aGlzLl9xdWV1ZS5sZW5ndGg/dGhpcy5faW5zZXJ0KHRoaXMuX3F1ZXVlLnNoaWZ0KCkpOnRoaXMuX3JlcXNXYWl0aW5nfHx0aGlzLl9maW5pc2goKX0sX3BvbGw6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPW4uX3BlbmRpbmdDU1MsaT1lLlVBLndlYmtpdCxzLG8sdSxhLGYsbDtpZih0KXtyfHwocj1uLl9wZW5kaW5nQ1NTPVtdKSxyLnB1c2godCk7aWYobi5fcG9sbFRpbWVyKXJldHVybn1uLl9wb2xsVGltZXI9bnVsbDtmb3Iocz0wO3M8ci5sZW5ndGg7KytzKXtmPXJbc107aWYoaSl7bD1mLmRvYy5zdHlsZVNoZWV0cyx1PWwubGVuZ3RoLGE9Zi5ub2RlLmhyZWY7d2hpbGUoLS11Pj0wKWlmKGxbdV0uaHJlZj09PWEpe3Iuc3BsaWNlKHMsMSkscy09MSxuLl9wcm9ncmVzcyhudWxsLGYpO2JyZWFrfX1lbHNlIHRyeXtvPSEhZi5ub2RlLnNoZWV0LmNzc1J1bGVzLHIuc3BsaWNlKHMsMSkscy09MSxuLl9wcm9ncmVzcyhudWxsLGYpfWNhdGNoKGMpe319ci5sZW5ndGgmJihuLl9wb2xsVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe24uX3BvbGwuY2FsbChuKX0sbi5vcHRpb25zLnBvbGxJbnRlcnZhbCkpfSxfcHJvZ3Jlc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm9wdGlvbnMKO2UmJih0LmVycm9yPWUsdGhpcy5lcnJvcnMucHVzaCh7ZXJyb3I6ZSxyZXF1ZXN0OnR9KSksdC5ub2RlLl95dWlnZXRfZmluaXNoZWQ9dC5maW5pc2hlZD0hMCxuLm9uUHJvZ3Jlc3MmJm4ub25Qcm9ncmVzcy5jYWxsKG4uY29udGV4dHx8dGhpcyx0aGlzLl9nZXRFdmVudERhdGEodCkpLHQuYXV0b3B1cmdlJiYoaS5fYXV0b1B1cmdlKHRoaXMub3B0aW9ucy5wdXJnZXRocmVzaG9sZCksaS5fcHVyZ2VOb2Rlcy5wdXNoKHQubm9kZSkpLHRoaXMuX3BlbmRpbmc9PT10JiYodGhpcy5fcGVuZGluZz1udWxsKSx0aGlzLl9yZXFzV2FpdGluZy09MSx0aGlzLl9uZXh0KCl9fX0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pLFlVSS5hZGQoImZlYXR1cmVzIixmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2UubWl4KGUubmFtZXNwYWNlKCJGZWF0dXJlcyIpLHt0ZXN0czpuLGFkZDpmdW5jdGlvbihlLHQscil7bltlXT1uW2VdfHx7fSxuW2VdW3RdPXJ9LGFsbDpmdW5jdGlvbih0LHIpe3ZhciBpPW5bdF0scz1bXTtyZXR1cm4gaSYmZS5PYmplY3QuZWFjaChpLGZ1bmN0aW9uKG4saSl7cy5wdXNoKGkrIjoiKyhlLkZlYXR1cmVzLnRlc3QodCxpLHIpPzE6MCkpfSkscy5sZW5ndGg/cy5qb2luKCI7Iik6IiJ9LHRlc3Q6ZnVuY3Rpb24odCxyLGkpe2k9aXx8W107dmFyIHMsbyx1LGE9blt0XSxmPWEmJmFbcl07cmV0dXJuIWZ8fChzPWYucmVzdWx0LGUuTGFuZy5pc1VuZGVmaW5lZChzKSYmKG89Zi51YSxvJiYocz1lLlVBW29dKSx1PWYudGVzdCx1JiYoIW98fHMpJiYocz11LmFwcGx5KGUsaSkpLGYucmVzdWx0PXMpKSxzfX0pO3ZhciByPWUuRmVhdHVyZXMuYWRkO3IoImxvYWQiLCIwIix7bmFtZToiYXBwLXRyYW5zaXRpb25zLW5hdGl2ZSIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10P3QuZG9jdW1lbnRFbGVtZW50Om51bGw7cmV0dXJuIG4mJm4uc3R5bGU/Ik1velRyYW5zaXRpb24iaW4gbi5zdHlsZXx8IldlYmtpdFRyYW5zaXRpb24iaW4gbi5zdHlsZXx8InRyYW5zaXRpb24iaW4gbi5zdHlsZTohMX0sdHJpZ2dlcjoiYXBwLXRyYW5zaXRpb25zIn0pLHIoImxvYWQiLCIxIix7bmFtZToiYXV0b2NvbXBsZXRlLWxpc3Qta2V5cyIsdGVzdDpmdW5jdGlvbihlKXtyZXR1cm4hZS5VQS5pb3MmJiFlLlVBLmFuZHJvaWR9LHRyaWdnZXI6ImF1dG9jb21wbGV0ZS1saXN0In0pLHIoImxvYWQiLCIyIix7bmFtZToiZGQtZ2VzdHVyZXMiLHRyaWdnZXI6ImRkLWRyYWciLHVhOiJ0b3VjaEVuYWJsZWQifSkscigibG9hZCIsIjMiLHtuYW1lOiJkb20tc3R5bGUtaWUiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5GZWF0dXJlcy50ZXN0LG49ZS5GZWF0dXJlcy5hZGQscj1lLmNvbmZpZy53aW4saT1lLmNvbmZpZy5kb2Mscz0iZG9jdW1lbnRFbGVtZW50IixvPSExO3JldHVybiBuKCJzdHlsZSIsImNvbXB1dGVkU3R5bGUiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHImJiJnZXRDb21wdXRlZFN0eWxlImluIHJ9fSksbigic3R5bGUiLCJvcGFjaXR5Iix7dGVzdDpmdW5jdGlvbigpe3JldHVybiBpJiYib3BhY2l0eSJpbiBpW3NdLnN0eWxlfX0pLG89IXQoInN0eWxlIiwib3BhY2l0eSIpJiYhdCgic3R5bGUiLCJjb21wdXRlZFN0eWxlIiksb30sdHJpZ2dlcjoiZG9tLXN0eWxlIn0pLHIoImxvYWQiLCI0Iix7bmFtZToiZWRpdG9yLXBhcmEtaWUiLHRyaWdnZXI6ImVkaXRvci1wYXJhIix1YToiaWUiLHdoZW46Imluc3RlYWQifSkscigibG9hZCIsIjUiLHtuYW1lOiJldmVudC1iYXNlLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmltcGxlbWVudGF0aW9uO3JldHVybiB0JiYhdC5oYXNGZWF0dXJlKCJFdmVudHMiLCIyLjAiKX0sdHJpZ2dlcjoibm9kZS1iYXNlIn0pLHIoImxvYWQiLCI2Iix7bmFtZToiZ3JhcGhpY3MtY2FudmFzIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lJiZlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZT09ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuKCFpfHxuKSYmciYmci5nZXRDb250ZXh0JiZyLmdldENvbnRleHQoIjJkIil9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCI3Iix7bmFtZToiZ3JhcGhpY3MtY2FudmFzLWRlZmF1bHQiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49ZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmUmJmUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lPT0iY2FudmFzIixyPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT10JiZ0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKTtyZXR1cm4oIWl8fG4pJiZyJiZyLmdldENvbnRleHQmJnIuZ2V0Q29udGV4dCgiMmQiKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSkscigibG9hZCIsIjgiLHtuYW1lOiJncmFwaGljcy1zdmciLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49IWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lfHxlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZSE9ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuIGkmJihufHwhcil9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCI5Iix7bmFtZToiZ3JhcGhpY3Mtc3ZnLWRlZmF1bHQiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49IWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lfHxlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZSE9ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuIGkmJihufHwhcil9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCIxMCIse25hbWU6ImdyYXBoaWNzLXZtbCIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3JldHVybiB0JiYhdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIikmJighbnx8IW4uZ2V0Q29udGV4dHx8IW4uZ2V0Q29udGV4dCgiMmQiKSl9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCIxMSIse25hbWU6ImdyYXBoaWNzLXZtbC1kZWZhdWx0Iix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJuIHQmJiF0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKSYmKCFufHwhbi5nZXRDb250ZXh0fHwhbi5nZXRDb250ZXh0KCIyZCIpKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSkscigibG9hZCIsIjEyIix7bmFtZToiaGlzdG9yeS1oYXNoLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmRvY3VtZW50TW9kZTtyZXR1cm4gZS5VQS5pZSYmKCEoIm9uaGFzaGNoYW5nZSJpbiBlLmNvbmZpZy53aW4pfHwhdHx8dDw4KX0sdHJpZ2dlcjoiaGlzdG9yeS1oYXNoIn0pLHIoImxvYWQiLCIxMyIse25hbWU6ImlvLW5vZGVqcyIsdHJpZ2dlcjoiaW8tYmFzZSIsdWE6Im5vZGVqcyJ9KSxyKCJsb2FkIiwiMTQiLHtuYW1lOiJqc29uLXBhcnNlLXNoaW0iLHRlc3Q6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gaShlLHQpe3JldHVybiBlPT09Im9rIj8hMDp0fXZhciB0PWUuY29uZmlnLmdsb2JhbC5KU09OLG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgSlNPTl0iJiZ0LHI9ZS5jb25maWcudXNlTmF0aXZlSlNPTlBhcnNlIT09ITEmJiEhbjtpZihyKXRyeXtyPW4ucGFyc2UoJ3sib2siOmZhbHNlfScsaSkub2t9Y2F0Y2gocyl7cj0hMX1yZXR1cm4hcn0sdHJpZ2dlcjoianNvbi1wYXJzZSJ9KSxyKCJsb2FkIiwiMTUiLHtuYW1lOiJqc29uLXN0cmluZ2lmeS1zaGltIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmdsb2JhbC5KU09OLG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgSlNPTl0iJiZ0LHI9ZS5jb25maWcudXNlTmF0aXZlSlNPTlN0cmluZ2lmeSE9PSExJiYhIW47aWYocil0cnl7cj0iMCI9PT1uLnN0cmluZ2lmeSgwKX1jYXRjaChpKXtyPSExfXJldHVybiFyfSx0cmlnZ2VyOiJqc29uLXN0cmluZ2lmeSJ9KSxyKCJsb2FkIiwiMTYiLHtuYW1lOiJzY3JvbGx2aWV3LWJhc2UtaWUiLHRyaWdnZXI6InNjcm9sbHZpZXctYmFzZSIsdWE6ImllIn0pLHIoImxvYWQiLCIxNyIse25hbWU6InNlbGVjdG9yLWNzczIiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49dCYmISgicXVlcnlTZWxlY3RvckFsbCJpbiB0KTtyZXR1cm4gbn0sdHJpZ2dlcjoic2VsZWN0b3IifSkscigibG9hZCIsIjE4Iix7bmFtZToidHJhbnNpdGlvbi10aW1lciIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10P3QuZG9jdW1lbnRFbGVtZW50Om51bGwscj0hMDtyZXR1cm4gbiYmbi5zdHlsZSYmKHI9ISgiTW96VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwiV2Via2l0VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwidHJhbnNpdGlvbiJpbiBuLnN0eWxlKSkscn0sdHJpZ2dlcjoidHJhbnNpdGlvbiJ9KSxyKCJsb2FkIiwiMTkiLHtuYW1lOiJ3aWRnZXQtYmFzZS1pZSIsdHJpZ2dlcjoid2lkZ2V0LWJhc2UiLHVhOiJpZSJ9KSxyKCJsb2FkIiwiMjAiLHtuYW1lOiJ5cWwtanNvbnAiLHRlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIWUuVUEubm9kZWpzJiYhZS5VQS53aW5qc30sdHJpZ2dlcjoieXFsIn0pLHIoImxvYWQiLCIyMSIse25hbWU6InlxbC1ub2RlanMiLHRyaWdnZXI6InlxbCIsdWE6Im5vZGVqcyJ9KSxyKCJsb2FkIiwiMjIiLHtuYW1lOiJ5cWwtd2luanMiLHRyaWdnZXI6InlxbCIsdWE6IndpbmpzIn0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSksWVVJLmFkZCgiaW50bC1iYXNlIixmdW5jdGlvbihlLHQpe3ZhciBuPS9bLCBdLztlLm1peChlLm5hbWVzcGFjZSgiSW50bCIpLHtsb29rdXBCZXN0TGFuZzpmdW5jdGlvbih0LHIpe2Z1bmN0aW9uIGEoZSl7dmFyIHQ7Zm9yKHQ9MDt0PHIubGVuZ3RoO3QrPTEpaWYoZS50b0xvd2VyQ2FzZSgpPT09clt0XS50b0xvd2VyQ2FzZSgpKXJldHVybiByW3RdfXZhciBpLHMsbyx1O2UuTGFuZy5pc1N0cmluZyh0KSYmKHQ9dC5zcGxpdChuKSk7Zm9yKGk9MDtpPHQubGVuZ3RoO2krPTEpe3M9dFtpXTtpZighc3x8cz09PSIqIiljb250aW51ZTt3aGlsZShzLmxlbmd0aD4wKXtvPWEocyk7aWYobylyZXR1cm4gbzt1PXMubGFzdEluZGV4T2YoIi0iKTtpZighKHU+PTApKWJyZWFrO3M9cy5zdWJzdHJpbmcoMCx1KSx1Pj0yJiZzLmNoYXJBdCh1LTIpPT09Ii0iJiYocz1zLnN1YnN0cmluZygwLHUtMikpfX1yZXR1cm4iIn19KX0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pLFlVSS5hZGQoInl1aS1sb2ciLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZSxyPSJ5dWk6bG9nIixpPSJ1bmRlZmluZWQiLHM9e2RlYnVnOjEsaW5mbzoyLHdhcm46NCxlcnJvcjo4fTtuLmxvZz1mdW5jdGlvbihlLHQsbyx1KXt2YXIgYSxmLGwsYyxoLHAsZD1uLHY9ZC5jb25maWcsbT1kLmZpcmU/ZDpZVUkuRW52Ci5nbG9iYWxFdmVudHM7cmV0dXJuIHYuZGVidWcmJihvPW98fCIiLHR5cGVvZiBvIT0idW5kZWZpbmVkIiYmKGY9di5sb2dFeGNsdWRlLGw9di5sb2dJbmNsdWRlLCFsfHxvIGluIGw/bCYmbyBpbiBsP2E9IWxbb106ZiYmbyBpbiBmJiYoYT1mW29dKTphPTEsdHlwZW9mIHQ9PSJ1bmRlZmluZWQiJiYodD0iaW5mbyIpLGQuY29uZmlnLmxvZ0xldmVsPWQuY29uZmlnLmxvZ0xldmVsfHwiZGVidWciLHA9c1tkLmNvbmZpZy5sb2dMZXZlbC50b0xvd2VyQ2FzZSgpXSx0IGluIHMmJnNbdF08cCYmKGE9MSkpLGF8fCh2LnVzZUJyb3dzZXJDb25zb2xlJiYoYz1vP28rIjogIitlOmUsZC5MYW5nLmlzRnVuY3Rpb24odi5sb2dGbik/di5sb2dGbi5jYWxsKGQsZSx0LG8pOnR5cGVvZiBjb25zb2xlIT09aSYmY29uc29sZS5sb2c/KGg9dCYmY29uc29sZVt0XSYmdCBpbiBzP3Q6ImxvZyIsY29uc29sZVtoXShjKSk6dHlwZW9mIG9wZXJhIT09aSYmb3BlcmEucG9zdEVycm9yKGMpKSxtJiYhdSYmKG09PT1kJiYhbS5nZXRFdmVudChyKSYmbS5wdWJsaXNoKHIse2Jyb2FkY2FzdDoyfSksbS5maXJlKHIse21zZzplLGNhdDp0LHNyYzpvfSkpKSksZH0sbi5tZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIG4ubG9nLmFwcGx5KG4sYXJndW1lbnRzKX19LCIzLjE3LjIiLHtyZXF1aXJlczpbInl1aS1iYXNlIl19KSxZVUkuYWRkKCJ5dWktbGF0ZXIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49W107ZS5sYXRlcj1mdW5jdGlvbih0LHIsaSxzLG8pe3Q9dHx8MCxzPWUuTGFuZy5pc1VuZGVmaW5lZChzKT9uOmUuQXJyYXkocykscj1yfHxlLmNvbmZpZy53aW58fGU7dmFyIHU9ITEsYT1yJiZlLkxhbmcuaXNTdHJpbmcoaSk/cltpXTppLGY9ZnVuY3Rpb24oKXt1fHwoYS5hcHBseT9hLmFwcGx5KHIsc3x8bik6YShzWzBdLHNbMV0sc1syXSxzWzNdKSl9LGw9bz9zZXRJbnRlcnZhbChmLHQpOnNldFRpbWVvdXQoZix0KTtyZXR1cm57aWQ6bCxpbnRlcnZhbDpvLGNhbmNlbDpmdW5jdGlvbigpe3U9ITAsdGhpcy5pbnRlcnZhbD9jbGVhckludGVydmFsKGwpOmNsZWFyVGltZW91dChsKX19fSxlLkxhbmcubGF0ZXI9ZS5sYXRlcn0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pLFlVSS5hZGQoImxvYWRlci1iYXNlIixmdW5jdGlvbihlLHQpeyhmdW5jdGlvbigpe3ZhciB0PWUudmVyc2lvbixuPSIvYnVpbGQvIixyPXQrIi8iLGk9ZS5FbnYuYmFzZSxzPSJnYWxsZXJ5LTIwMTQuMDUuMjktMTUtNDYiLG89IjJpbjMiLHU9IjQiLGE9IjIuOS4wIixmPWkrImNvbWJvPyIsbD17dmVyc2lvbjp0LHJvb3Q6cixiYXNlOmUuRW52LmJhc2UsY29tYm9CYXNlOmYsc2tpbjp7ZGVmYXVsdFNraW46InNhbSIsYmFzZToiYXNzZXRzL3NraW5zLyIscGF0aDoic2tpbi5jc3MiLGFmdGVyOlsiY3NzcmVzZXQiLCJjc3Nmb250cyIsImNzc2dyaWRzIiwiY3NzYmFzZSIsImNzc3Jlc2V0LWNvbnRleHQiLCJjc3Nmb250cy1jb250ZXh0Il19LGdyb3Vwczp7fSxwYXR0ZXJuczp7fX0sYz1sLmdyb3VwcyxoPWZ1bmN0aW9uKGUsdCxyKXt2YXIgcz1vKyIuIisoZXx8dSkrIi8iKyh0fHxhKStuLGw9ciYmci5iYXNlP3IuYmFzZTppLGg9ciYmci5jb21ib0Jhc2U/ci5jb21ib0Jhc2U6ZjtjLnl1aTIuYmFzZT1sK3MsYy55dWkyLnJvb3Q9cyxjLnl1aTIuY29tYm9CYXNlPWh9LHA9ZnVuY3Rpb24oZSx0KXt2YXIgcj0oZXx8cykrbixvPXQmJnQuYmFzZT90LmJhc2U6aSx1PXQmJnQuY29tYm9CYXNlP3QuY29tYm9CYXNlOmY7Yy5nYWxsZXJ5LmJhc2U9bytyLGMuZ2FsbGVyeS5yb290PXIsYy5nYWxsZXJ5LmNvbWJvQmFzZT11fTtjW3RdPXt9LGMuZ2FsbGVyeT17ZXh0OiExLGNvbWJpbmU6ITAsY29tYm9CYXNlOmYsdXBkYXRlOnAscGF0dGVybnM6eyJnYWxsZXJ5LSI6e30sImxhbmcvZ2FsbGVyeS0iOnt9LCJnYWxsZXJ5Y3NzLSI6e3R5cGU6ImNzcyJ9fX0sYy55dWkyPXtjb21iaW5lOiEwLGV4dDohMSxjb21ib0Jhc2U6Zix1cGRhdGU6aCxwYXR0ZXJuczp7Inl1aTItIjp7Y29uZmlnRm46ZnVuY3Rpb24oZSl7Ly1za2lufHJlc2V0fGZvbnRzfGdyaWRzfGJhc2UvLnRlc3QoZS5uYW1lKSYmKGUudHlwZT0iY3NzIixlLnBhdGg9ZS5wYXRoLnJlcGxhY2UoL1wuanMvLCIuY3NzIiksZS5wYXRoPWUucGF0aC5yZXBsYWNlKC9cL3l1aTItc2tpbi8sIi9hc3NldHMvc2tpbnMvc2FtL3l1aTItc2tpbiIpKX19fX0scCgpLGgoKSxZVUkuRW52W3RdJiZlLm1peChsLFlVSS5FbnZbdF0sITEsWyJtb2R1bGVzIiwiZ3JvdXBzIiwic2tpbiJdLDAsITApLFlVSS5FbnZbdF09bH0pKCk7dmFyIG49e30scj1bXSxpPTEwMjQscz1ZVUkuRW52LG89cy5fbG9hZGVkLHU9ImNzcyIsYT0ianMiLGY9ImludGwiLGw9InNhbSIsYz1lLnZlcnNpb24saD0iIixwPWUuT2JqZWN0LGQ9cC5lYWNoLHY9ZS5BcnJheSxtPXMuX2xvYWRlclF1ZXVlLGc9c1tjXSx5PSJza2luLSIsYj1lLkxhbmcsdz1zLm1vZHMsRSxTPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUrIi8iK3Q7cmV0dXJuIHJ8fChpKz0iLW1pbiIpLGkrPSIuIisobnx8dSksaX07WVVJLkVudi5fY3NzTG9hZGVkfHwoWVVJLkVudi5fY3NzTG9hZGVkPXt9KSxlLkVudi5tZXRhPWcsZS5Mb2FkZXI9ZnVuY3Rpb24odCl7dmFyIG49dGhpczt0PXR8fHt9LEU9Zy5tZDUsbi5jb250ZXh0PWUsdC5kb0JlZm9yZUxvYWRlciYmdC5kb0JlZm9yZUxvYWRlci5hcHBseShuLGFyZ3VtZW50cyksbi5iYXNlPWUuRW52Lm1ldGEuYmFzZStlLkVudi5tZXRhLnJvb3Qsbi5jb21ib0Jhc2U9ZS5FbnYubWV0YS5jb21ib0Jhc2Usbi5jb21iaW5lPXQuYmFzZSYmdC5iYXNlLmluZGV4T2Yobi5jb21ib0Jhc2Uuc3Vic3RyKDAsMjApKT4tMSxuLmNvbWJvU2VwPSImIixuLm1heFVSTExlbmd0aD1pLG4uaWdub3JlUmVnaXN0ZXJlZD10Lmlnbm9yZVJlZ2lzdGVyZWQsbi5yb290PWUuRW52Lm1ldGEucm9vdCxuLnRpbWVvdXQ9MCxuLmZvcmNlTWFwPXt9LG4uYWxsb3dSb2xsdXA9ITEsbi5maWx0ZXJzPXt9LG4ucmVxdWlyZWQ9e30sbi5wYXR0ZXJucz17fSxuLm1vZHVsZUluZm89e30sbi5ncm91cHM9ZS5tZXJnZShlLkVudi5tZXRhLmdyb3Vwcyksbi5za2luPWUubWVyZ2UoZS5FbnYubWV0YS5za2luKSxuLmNvbmRpdGlvbnM9e30sbi5jb25maWc9dCxuLl9pbnRlcm5hbD0hMCxuLl9wb3B1bGF0ZUNvbmRpdGlvbnNDYWNoZSgpLG4ubG9hZGVkPW9bY10sbi5hc3luYz0hMCxuLl9pbnNwZWN0UGFnZSgpLG4uX2ludGVybmFsPSExLG4uX2NvbmZpZyh0KSxuLmZvcmNlTWFwPW4uZm9yY2U/ZS5BcnJheS5oYXNoKG4uZm9yY2UpOnt9LG4udGVzdHJlc3VsdHM9bnVsbCxlLmNvbmZpZy50ZXN0cyYmKG4udGVzdHJlc3VsdHM9ZS5jb25maWcudGVzdHMpLG4uc29ydGVkPVtdLG4uZGlydHk9ITAsbi5pbnNlcnRlZD17fSxuLnNraXBwZWQ9e30sbi50ZXN0ZWQ9e30sbi5pZ25vcmVSZWdpc3RlcmVkJiZuLl9yZXNldE1vZHVsZXMoKX0sZS5Mb2FkZXIucHJvdG90eXBlPXtnZXRNb2R1bGVJbmZvOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMubW9kdWxlSW5mb1t0XSxyLGksbyxhO3JldHVybiBuP246KHI9Zy5tb2R1bGVzLGk9cy5fcmVuZGVyZWRNb2RzLG89dGhpcy5faW50ZXJuYWwsaSYmaS5oYXNPd25Qcm9wZXJ0eSh0KSYmIXRoaXMuaWdub3JlUmVnaXN0ZXJlZD90aGlzLm1vZHVsZUluZm9bdF09ZS5tZXJnZShpW3RdKTpyLmhhc093blByb3BlcnR5KHQpJiYodGhpcy5faW50ZXJuYWw9ITAsYT10aGlzLmFkZE1vZHVsZShyW3RdLHQpLGEmJmEudHlwZT09PXUmJnRoaXMuaXNDU1NMb2FkZWQoYS5uYW1lLCEwKSYmKHRoaXMubG9hZGVkW2EubmFtZV09ITApLHRoaXMuX2ludGVybmFsPW8pLHRoaXMubW9kdWxlSW5mb1t0XSl9LF9leHBhbmRBbGlhc2VzOmZ1bmN0aW9uKHQpe3ZhciBuPVtdLHI9WVVJLkVudi5hbGlhc2VzLGksczt0PWUuQXJyYXkodCk7Zm9yKGk9MDtpPHQubGVuZ3RoO2krPTEpcz10W2ldLG4ucHVzaC5hcHBseShuLHJbc10/cltzXTpbc10pO3JldHVybiBufSxfcG9wdWxhdGVDb25kaXRpb25zQ2FjaGU6ZnVuY3Rpb24oKXt2YXIgdD1nLm1vZHVsZXMsbj1zLl9jb25kaXRpb25zLHIsaSxvLHU7aWYobiYmIXRoaXMuaWdub3JlUmVnaXN0ZXJlZClmb3IociBpbiBuKW4uaGFzT3duUHJvcGVydHkocikmJih0aGlzLmNvbmRpdGlvbnNbcl09ZS5tZXJnZShuW3JdKSk7ZWxzZXtmb3IociBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocikmJnRbcl0uY29uZGl0aW9uKXtvPXRoaXMuX2V4cGFuZEFsaWFzZXModFtyXS5jb25kaXRpb24udHJpZ2dlcik7Zm9yKGk9MDtpPG8ubGVuZ3RoO2krPTEpdT1vW2ldLHRoaXMuY29uZGl0aW9uc1t1XT10aGlzLmNvbmRpdGlvbnNbdV18fHt9LHRoaXMuY29uZGl0aW9uc1t1XVt0W3JdLm5hbWV8fHJdPXRbcl0uY29uZGl0aW9ufXMuX2NvbmRpdGlvbnM9dGhpcy5jb25kaXRpb25zfX0sX3Jlc2V0TW9kdWxlczpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdCxuLHIsaSxzO2Zvcih0IGluIGUubW9kdWxlSW5mbylpZihlLm1vZHVsZUluZm8uaGFzT3duUHJvcGVydHkodCkmJmUubW9kdWxlSW5mb1t0XSl7cj1lLm1vZHVsZUluZm9bdF0saT1yLm5hbWUscz1ZVUkuRW52Lm1vZHNbaV0/WVVJLkVudi5tb2RzW2ldLmRldGFpbHM6bnVsbCxzJiYoZS5tb2R1bGVJbmZvW2ldLl9yZXNldD0hMCxlLm1vZHVsZUluZm9baV0ucmVxdWlyZXM9cy5yZXF1aXJlc3x8W10sZS5tb2R1bGVJbmZvW2ldLm9wdGlvbmFsPXMub3B0aW9uYWx8fFtdLGUubW9kdWxlSW5mb1tpXS5zdXBlcnNlZGVzPXMuc3VwZXJjZWRlc3x8W10pO2lmKHIuZGVmYXVsdHMpZm9yKG4gaW4gci5kZWZhdWx0cylyLmRlZmF1bHRzLmhhc093blByb3BlcnR5KG4pJiZyW25dJiYocltuXT1yLmRlZmF1bHRzW25dKTtyLmxhbmdDYWNoZT11bmRlZmluZWQsci5za2luQ2FjaGU9dW5kZWZpbmVkLHIuc2tpbm5hYmxlJiZlLl9hZGRTa2luKGUuc2tpbi5kZWZhdWx0U2tpbixyLm5hbWUpfX0sUkVHRVhfQ1NTOi9cLmNzcyg/Ols/O10uKik/JC9pLEZJTFRFUl9ERUZTOntSQVc6e3NlYXJjaEV4cDoiLW1pblxcLmpzIixyZXBsYWNlU3RyOiIuanMifSxERUJVRzp7c2VhcmNoRXhwOiItbWluXFwuanMiLHJlcGxhY2VTdHI6Ii1kZWJ1Zy5qcyJ9LENPVkVSQUdFOntzZWFyY2hFeHA6Ii1taW5cXC5qcyIscmVwbGFjZVN0cjoiLWNvdmVyYWdlLmpzIn19LF9pbnNwZWN0UGFnZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdCxuLHIsaSxzO2ZvcihzIGluIHcpdy5oYXNPd25Qcm9wZXJ0eShzKSYmKHQ9d1tzXSx0LmRldGFpbHMmJihuPWUuZ2V0TW9kdWxlSW5mbyh0Lm5hbWUpLHI9dC5kZXRhaWxzLnJlcXVpcmVzLGk9biYmbi5yZXF1aXJlcyxuPyFuLl9pbnNwZWN0ZWQmJnImJmkubGVuZ3RoIT09ci5sZW5ndGgmJmRlbGV0ZSBuLmV4cGFuZGVkOm49ZS5hZGRNb2R1bGUodC5kZXRhaWxzLHMpLG4uX2luc3BlY3RlZD0hMCkpfSxfcmVxdWlyZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvPXRoaXMuZ2V0TW9kdWxlSW5mbyhlKSxhPXRoaXMuZ2V0TW9kdWxlSW5mbyh0KTtpZighb3x8IWEpcmV0dXJuITE7cj1vLmV4cGFuZGVkX21hcCxpPW8uYWZ0ZXJfbWFwO2lmKGkmJnQgaW4gaSlyZXR1cm4hMDtpPWEuYWZ0ZXJfbWFwO2lmKGkmJmUgaW4gaSlyZXR1cm4hMTtzPWEuc3VwZXJzZWRlcztpZihzKWZvcihuPTA7bjxzLmxlbmd0aDtuKyspaWYodGhpcy5fcmVxdWlyZXMoZSxzW25dKSlyZXR1cm4hMDtzPW8uc3VwZXJzZWRlcztpZihzKWZvcihuPTA7bjxzLmxlbmd0aDtuKyspaWYodGhpcy5fcmVxdWlyZXModCxzW25dKSlyZXR1cm4hMTtyZXR1cm4gciYmdCBpbiByPyEwOm8uZXh0JiZvLnR5cGU9PT11JiYhYS5leHQmJmEudHlwZT09PXU/ITA6ITF9LF9jb25maWc6ZnVuY3Rpb24odCl7dmFyIG4scixpLHMsbyx1LGEsZj10aGlzLGw9W10sYyxoO2lmKHQpZm9yKG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pKXtpPXRbbl07aWYobj09PSJyZXF1aXJlIilmLnJlcXVpcmUoaSk7ZWxzZSBpZihuPT09InNraW4iKXR5cGVvZiBpPT0ic3RyaW5nIiYmKGYuc2tpbi5kZWZhdWx0U2tpbj0KdC5za2luLGk9e2RlZmF1bHRTa2luOml9KSxlLm1peChmLnNraW4saSwhMCk7ZWxzZSBpZihuPT09Imdyb3VwcyIpe2ZvcihyIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShyKSl7YT1yLHU9aVtyXSxmLmFkZEdyb3VwKHUsYSk7aWYodS5hbGlhc2VzKWZvcihzIGluIHUuYWxpYXNlcyl1LmFsaWFzZXMuaGFzT3duUHJvcGVydHkocykmJmYuYWRkQWxpYXModS5hbGlhc2VzW3NdLHMpfX1lbHNlIGlmKG49PT0ibW9kdWxlcyIpZm9yKHIgaW4gaSlpLmhhc093blByb3BlcnR5KHIpJiZmLmFkZE1vZHVsZShpW3JdLHIpO2Vsc2UgaWYobj09PSJhbGlhc2VzIilmb3IociBpbiBpKWkuaGFzT3duUHJvcGVydHkocikmJmYuYWRkQWxpYXMoaVtyXSxyKTtlbHNlIG49PT0iZ2FsbGVyeSI/dGhpcy5ncm91cHMuZ2FsbGVyeS51cGRhdGUmJnRoaXMuZ3JvdXBzLmdhbGxlcnkudXBkYXRlKGksdCk6bj09PSJ5dWkyInx8bj09PSIyaW4zIj90aGlzLmdyb3Vwcy55dWkyLnVwZGF0ZSYmdGhpcy5ncm91cHMueXVpMi51cGRhdGUodFsiMmluMyJdLHQueXVpMix0KTpmW25dPWl9bz1mLmZpbHRlcixiLmlzU3RyaW5nKG8pJiYobz1vLnRvVXBwZXJDYXNlKCksZi5maWx0ZXJOYW1lPW8sZi5maWx0ZXI9Zi5GSUxURVJfREVGU1tvXSxvPT09IkRFQlVHIiYmZi5yZXF1aXJlKCJ5dWktbG9nIiwiZHVtcCIpKTtpZihmLmZpbHRlck5hbWUmJmYuY292ZXJhZ2UmJmYuZmlsdGVyTmFtZT09PSJDT1ZFUkFHRSImJmIuaXNBcnJheShmLmNvdmVyYWdlKSYmZi5jb3ZlcmFnZS5sZW5ndGgpe2ZvcihuPTA7bjxmLmNvdmVyYWdlLmxlbmd0aDtuKyspYz1mLmNvdmVyYWdlW25dLGg9Zi5nZXRNb2R1bGVJbmZvKGMpLGgmJmgudXNlP2w9bC5jb25jYXQoaC51c2UpOmwucHVzaChjKTtmLmZpbHRlcnM9Zi5maWx0ZXJzfHx7fSxlLkFycmF5LmVhY2gobCxmdW5jdGlvbihlKXtmLmZpbHRlcnNbZV09Zi5GSUxURVJfREVGUy5DT1ZFUkFHRX0pLGYuZmlsdGVyTmFtZT0iUkFXIixmLmZpbHRlcj1mLkZJTFRFUl9ERUZTW2YuZmlsdGVyTmFtZV19fSxmb3JtYXRTa2luOmZ1bmN0aW9uKGUsdCl7dmFyIG49eStlO3JldHVybiB0JiYobj1uKyItIit0KSxufSxfYWRkU2tpbjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxzLG89dGhpcy5za2luLHU9dCYmdGhpcy5nZXRNb2R1bGVJbmZvKHQpLGE9dSYmdS5leHQ7cmV0dXJuIHQmJihpPXRoaXMuZm9ybWF0U2tpbihlLHQpLHRoaXMuZ2V0TW9kdWxlSW5mbyhpKXx8KHI9dS5wa2d8fHQscz17c2tpbjohMCxuYW1lOmksZ3JvdXA6dS5ncm91cCx0eXBlOiJjc3MiLGFmdGVyOm8uYWZ0ZXIscGF0aDoobnx8cikrIi8iK28uYmFzZStlKyIvIit0KyIuY3NzIixleHQ6YX0sdS5iYXNlJiYocy5iYXNlPXUuYmFzZSksdS5jb25maWdGbiYmKHMuY29uZmlnRm49dS5jb25maWdGbiksdGhpcy5hZGRNb2R1bGUocyxpKSkpLGl9LGFkZEFsaWFzOmZ1bmN0aW9uKGUsdCl7WVVJLkVudi5hbGlhc2VzW3RdPWUsdGhpcy5hZGRNb2R1bGUoe25hbWU6dCx1c2U6ZX0pfSxhZGRHcm91cDpmdW5jdGlvbihlLHQpe3ZhciBuPWUubW9kdWxlcyxyPXRoaXMsaSxzO3Q9dHx8ZS5uYW1lLGUubmFtZT10LHIuZ3JvdXBzW3RdPWU7aWYoZS5wYXR0ZXJucylmb3IoaSBpbiBlLnBhdHRlcm5zKWUucGF0dGVybnMuaGFzT3duUHJvcGVydHkoaSkmJihlLnBhdHRlcm5zW2ldLmdyb3VwPXQsci5wYXR0ZXJuc1tpXT1lLnBhdHRlcm5zW2ldKTtpZihuKWZvcihpIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShpKSYmKHM9bltpXSx0eXBlb2Ygcz09InN0cmluZyImJihzPXtuYW1lOmksZnVsbHBhdGg6c30pLHMuZ3JvdXA9dCxyLmFkZE1vZHVsZShzLGkpKX0sYWRkTW9kdWxlOmZ1bmN0aW9uKHQsbil7bj1ufHx0Lm5hbWUsdHlwZW9mIHQ9PSJzdHJpbmciJiYodD17bmFtZTpuLGZ1bGxwYXRoOnR9KTt2YXIgcixpLG8sZixsLGMscCxkLG0sZyx5LGIsdyxFLHgsVCxOLEMsayxMLEEsTyxNPXRoaXMubW9kdWxlSW5mb1tuXSxfPXRoaXMuY29uZGl0aW9ucyxEO00mJk0udGVtcCYmKHQ9ZS5tZXJnZShNLHQpKSx0Lm5hbWU9bjtpZighdHx8IXQubmFtZSlyZXR1cm4gbnVsbDt0LnR5cGV8fCh0LnR5cGU9YSxPPXQucGF0aHx8dC5mdWxscGF0aCxPJiZ0aGlzLlJFR0VYX0NTUy50ZXN0KE8pJiYodC50eXBlPXUpKSwhdC5wYXRoJiYhdC5mdWxscGF0aCYmKHQucGF0aD1TKG4sbix0LnR5cGUpKSx0LnN1cGVyc2VkZXM9dC5zdXBlcnNlZGVzfHx0LnVzZSx0LmV4dD0iZXh0ImluIHQ/dC5leHQ6dGhpcy5faW50ZXJuYWw/ITE6ITAscj10LnN1Ym1vZHVsZXMsdGhpcy5tb2R1bGVJbmZvW25dPXQsdC5yZXF1aXJlcz10LnJlcXVpcmVzfHxbXTtpZih0aGlzLnJlcXVpcmVzKWZvcihpPTA7aTx0aGlzLnJlcXVpcmVzLmxlbmd0aDtpKyspdC5yZXF1aXJlcy5wdXNoKHRoaXMucmVxdWlyZXNbaV0pO2lmKHQuZ3JvdXAmJnRoaXMuZ3JvdXBzJiZ0aGlzLmdyb3Vwc1t0Lmdyb3VwXSl7QT10aGlzLmdyb3Vwc1t0Lmdyb3VwXTtpZihBLnJlcXVpcmVzKWZvcihpPTA7aTxBLnJlcXVpcmVzLmxlbmd0aDtpKyspdC5yZXF1aXJlcy5wdXNoKEEucmVxdWlyZXNbaV0pfXQuZGVmYXVsdHN8fCh0LmRlZmF1bHRzPXtyZXF1aXJlczp0LnJlcXVpcmVzP1tdLmNvbmNhdCh0LnJlcXVpcmVzKTpudWxsLHN1cGVyc2VkZXM6dC5zdXBlcnNlZGVzP1tdLmNvbmNhdCh0LnN1cGVyc2VkZXMpOm51bGwsb3B0aW9uYWw6dC5vcHRpb25hbD9bXS5jb25jYXQodC5vcHRpb25hbCk6bnVsbH0pLHQuc2tpbm5hYmxlJiZ0LmV4dCYmdC50ZW1wJiYoaz10aGlzLl9hZGRTa2luKHRoaXMuc2tpbi5kZWZhdWx0U2tpbixuKSx0LnJlcXVpcmVzLnVuc2hpZnQoaykpLHQucmVxdWlyZXMubGVuZ3RoJiYodC5yZXF1aXJlcz10aGlzLmZpbHRlclJlcXVpcmVzKHQucmVxdWlyZXMpfHxbXSk7aWYoIXQubGFuZ1BhY2smJnQubGFuZyl7eT12KHQubGFuZyk7Zm9yKGc9MDtnPHkubGVuZ3RoO2crKylUPXlbZ10sYj10aGlzLmdldExhbmdQYWNrTmFtZShULG4pLHA9dGhpcy5nZXRNb2R1bGVJbmZvKGIpLHB8fChwPXRoaXMuX2FkZExhbmdQYWNrKFQsdCxiKSl9aWYocil7bD10LnN1cGVyc2VkZXN8fFtdLG89MDtmb3IoaSBpbiByKWlmKHIuaGFzT3duUHJvcGVydHkoaSkpe2M9cltpXSxjLnBhdGg9Yy5wYXRofHxTKG4saSx0LnR5cGUpLGMucGtnPW4sYy5ncm91cD10Lmdyb3VwLGMuc3VwZXJzZWRlcyYmKGw9bC5jb25jYXQoYy5zdXBlcnNlZGVzKSkscD10aGlzLmFkZE1vZHVsZShjLGkpLGwucHVzaChpKTtpZihwLnNraW5uYWJsZSl7dC5za2lubmFibGU9ITAsQz10aGlzLnNraW4ub3ZlcnJpZGVzO2lmKEMmJkNbaV0pZm9yKGc9MDtnPENbaV0ubGVuZ3RoO2crKylrPXRoaXMuX2FkZFNraW4oQ1tpXVtnXSxpLG4pLGwucHVzaChrKTtrPXRoaXMuX2FkZFNraW4odGhpcy5za2luLmRlZmF1bHRTa2luLGksbiksbC5wdXNoKGspfWlmKGMubGFuZyYmYy5sYW5nLmxlbmd0aCl7eT12KGMubGFuZyk7Zm9yKGc9MDtnPHkubGVuZ3RoO2crKylUPXlbZ10sYj10aGlzLmdldExhbmdQYWNrTmFtZShULG4pLHc9dGhpcy5nZXRMYW5nUGFja05hbWUoVCxpKSxwPXRoaXMuZ2V0TW9kdWxlSW5mbyhiKSxwfHwocD10aGlzLl9hZGRMYW5nUGFjayhULHQsYikpLEU9RXx8di5oYXNoKHAuc3VwZXJzZWRlcyksdyBpbiBFfHxwLnN1cGVyc2VkZXMucHVzaCh3KSx0Lmxhbmc9dC5sYW5nfHxbXSx4PXh8fHYuaGFzaCh0LmxhbmcpLFQgaW4geHx8dC5sYW5nLnB1c2goVCksYj10aGlzLmdldExhbmdQYWNrTmFtZShoLG4pLHc9dGhpcy5nZXRMYW5nUGFja05hbWUoaCxpKSxwPXRoaXMuZ2V0TW9kdWxlSW5mbyhiKSxwfHwocD10aGlzLl9hZGRMYW5nUGFjayhULHQsYikpLHcgaW4gRXx8cC5zdXBlcnNlZGVzLnB1c2godyl9bysrfXQuc3VwZXJzZWRlcz12LmRlZHVwZShsKSx0aGlzLmFsbG93Um9sbHVwJiYodC5yb2xsdXA9bzw0P286TWF0aC5taW4oby0xLDQpKX1kPXQucGx1Z2lucztpZihkKWZvcihpIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShpKSYmKG09ZFtpXSxtLnBrZz1uLG0ucGF0aD1tLnBhdGh8fFMobixpLHQudHlwZSksbS5yZXF1aXJlcz1tLnJlcXVpcmVzfHxbXSxtLmdyb3VwPXQuZ3JvdXAsdGhpcy5hZGRNb2R1bGUobSxpKSx0LnNraW5uYWJsZSYmdGhpcy5fYWRkU2tpbih0aGlzLnNraW4uZGVmYXVsdFNraW4saSxuKSk7aWYodC5jb25kaXRpb24pe2Y9dGhpcy5fZXhwYW5kQWxpYXNlcyh0LmNvbmRpdGlvbi50cmlnZ2VyKTtmb3IoaT0wO2k8Zi5sZW5ndGg7aSsrKUQ9ZltpXSxMPXQuY29uZGl0aW9uLndoZW4sX1tEXT1fW0RdfHx7fSxfW0RdW25dPXQuY29uZGl0aW9uLEwmJkwhPT0iYWZ0ZXIiP0w9PT0iaW5zdGVhZCImJih0LnN1cGVyc2VkZXM9dC5zdXBlcnNlZGVzfHxbXSx0LnN1cGVyc2VkZXMucHVzaChEKSk6KHQuYWZ0ZXI9dC5hZnRlcnx8W10sdC5hZnRlci5wdXNoKEQpKX1yZXR1cm4gdC5zdXBlcnNlZGVzJiYodC5zdXBlcnNlZGVzPXRoaXMuZmlsdGVyUmVxdWlyZXModC5zdXBlcnNlZGVzKSksdC5hZnRlciYmKHQuYWZ0ZXI9dGhpcy5maWx0ZXJSZXF1aXJlcyh0LmFmdGVyKSx0LmFmdGVyX21hcD12Lmhhc2godC5hZnRlcikpLHQuY29uZmlnRm4mJihOPXQuY29uZmlnRm4odCksTj09PSExJiYoZGVsZXRlIHRoaXMubW9kdWxlSW5mb1tuXSxkZWxldGUgcy5fcmVuZGVyZWRNb2RzW25dLHQ9bnVsbCkpLHQmJihzLl9yZW5kZXJlZE1vZHN8fChzLl9yZW5kZXJlZE1vZHM9e30pLHMuX3JlbmRlcmVkTW9kc1tuXT1lLm1peChzLl9yZW5kZXJlZE1vZHNbbl18fHt9LHQpLHMuX2NvbmRpdGlvbnM9XyksdH0scmVxdWlyZTpmdW5jdGlvbih0KXt2YXIgbj10eXBlb2YgdD09InN0cmluZyI/dihhcmd1bWVudHMpOnQ7dGhpcy5kaXJ0eT0hMCx0aGlzLnJlcXVpcmVkPWUubWVyZ2UodGhpcy5yZXF1aXJlZCx2Lmhhc2godGhpcy5maWx0ZXJSZXF1aXJlcyhuKSkpLHRoaXMuX2V4cGxvZGVSb2xsdXBzKCl9LF9leHBsb2RlUm9sbHVwczpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdCxuLHIsaSxzLG8sdSxhPWUucmVxdWlyZWQ7aWYoIWUuYWxsb3dSb2xsdXApe2ZvcihyIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShyKSl7dD1lLmdldE1vZHVsZShyKTtpZih0JiZ0LnVzZSl7bz10LnVzZS5sZW5ndGg7Zm9yKGk9MDtpPG87aSsrKXtuPWUuZ2V0TW9kdWxlKHQudXNlW2ldKTtpZihuJiZuLnVzZSl7dT1uLnVzZS5sZW5ndGg7Zm9yKHM9MDtzPHU7cysrKWFbbi51c2Vbc11dPSEwfWVsc2UgYVt0LnVzZVtpXV09ITB9fX1lLnJlcXVpcmVkPWF9fSxmaWx0ZXJSZXF1aXJlczpmdW5jdGlvbih0KXtpZih0KXtlLkxhbmcuaXNBcnJheSh0KXx8KHQ9W3RdKSx0PWUuQXJyYXkodCk7dmFyIG49W10scixpLHMsbztmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXtpPXRoaXMuZ2V0TW9kdWxlKHRbcl0pO2lmKGkmJmkudXNlKWZvcihzPTA7czxpLnVzZS5sZW5ndGg7cysrKW89dGhpcy5nZXRNb2R1bGUoaS51c2Vbc10pLG8mJm8udXNlJiZvLm5hbWUhPT1pLm5hbWU/bj1lLkFycmF5LmRlZHVwZShbXS5jb25jYXQobix0aGlzLmZpbHRlclJlcXVpcmVzKG8udXNlKSkpOm4ucHVzaChpLnVzZVtzXSk7ZWxzZSBuLnB1c2godFtyXSl9dD1ufXJldHVybiB0fSxfY2FuQmVBdHRhY2hlZDpmdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLmdldE1vZHVsZSh0KSx0JiZ0LnRlc3Q/KHQuaGFzT3duUHJvcGVydHkoIl90ZXN0UmVzdWx0Iil8fCh0Ll90ZXN0UmVzdWx0PXQudGVzdChlKSksdC5fdGVzdFJlc3VsdCk6ITB9LGdldFJlcXVpcmVzOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiByO2lmKHQuX3BhcnNlZClyZXR1cm4gdC5leHBhbmRlZHx8cjt2YXIgbixpLHMsbyx1LGEsbCxjPXRoaXMudGVzdHJlc3VsdHMsbT10Lm5hbWUsZyx5PXdbbV0mJndbbV0uZGV0YWlscyxiPXQub3B0aW9uYWxSZXF1aXJlcyxFLFMseCxULE4sQyxrLEwsQSxPLE09dC5sYW5nfHx0LmludGwsXz1lLkZlYXR1cmVzJiZlLkZlYXR1cmVzLnRlc3RzLmxvYWQsRCxQO3QudGVtcCYmeSYmKE49dCx0PXRoaXMuYWRkTW9kdWxlKHksbSksdC5ncm91cD1OLmdyb3VwLHQucGtnPQpOLnBrZyxkZWxldGUgdC5leHBhbmRlZCksUD0hIXRoaXMubGFuZyYmdC5sYW5nQ2FjaGUhPT10aGlzLmxhbmd8fHQuc2tpbkNhY2hlIT09dGhpcy5za2luLmRlZmF1bHRTa2luO2lmKHQuZXhwYW5kZWQmJiFQKXJldHVybiB0LmV4cGFuZGVkO2lmKGIpZm9yKG49MCxvPWIubGVuZ3RoO248bztuKyspdGhpcy5fY2FuQmVBdHRhY2hlZChiW25dKSYmdC5yZXF1aXJlcy5wdXNoKGJbbl0pO0U9W10sRD17fSxUPXRoaXMuZmlsdGVyUmVxdWlyZXModC5yZXF1aXJlcyksdC5sYW5nJiYoRS51bnNoaWZ0KCJpbnRsIiksVC51bnNoaWZ0KCJpbnRsIiksTT0hMCksQz10aGlzLmZpbHRlclJlcXVpcmVzKHQub3B0aW9uYWwpLHQuX3BhcnNlZD0hMCx0LmxhbmdDYWNoZT10aGlzLmxhbmcsdC5za2luQ2FjaGU9dGhpcy5za2luLmRlZmF1bHRTa2luO2ZvcihuPTA7bjxULmxlbmd0aDtuKyspaWYoIURbVFtuXV0pe0UucHVzaChUW25dKSxEW1Rbbl1dPSEwLGk9dGhpcy5nZXRNb2R1bGUoVFtuXSk7aWYoaSl7dT10aGlzLmdldFJlcXVpcmVzKGkpLE09TXx8aS5leHBhbmRlZF9tYXAmJmYgaW4gaS5leHBhbmRlZF9tYXA7Zm9yKHM9MDtzPHUubGVuZ3RoO3MrKylFLnB1c2godVtzXSl9fVQ9dGhpcy5maWx0ZXJSZXF1aXJlcyh0LnN1cGVyc2VkZXMpO2lmKFQpZm9yKG49MDtuPFQubGVuZ3RoO24rKylpZighRFtUW25dXSl7dC5zdWJtb2R1bGVzJiZFLnB1c2goVFtuXSksRFtUW25dXT0hMCxpPXRoaXMuZ2V0TW9kdWxlKFRbbl0pO2lmKGkpe3U9dGhpcy5nZXRSZXF1aXJlcyhpKSxNPU18fGkuZXhwYW5kZWRfbWFwJiZmIGluIGkuZXhwYW5kZWRfbWFwO2ZvcihzPTA7czx1Lmxlbmd0aDtzKyspRS5wdXNoKHVbc10pfX1pZihDJiZ0aGlzLmxvYWRPcHRpb25hbClmb3Iobj0wO248Qy5sZW5ndGg7bisrKWlmKCFEW0Nbbl1dKXtFLnB1c2goQ1tuXSksRFtDW25dXT0hMCxpPXRoaXMuZ2V0TW9kdWxlSW5mbyhDW25dKTtpZihpKXt1PXRoaXMuZ2V0UmVxdWlyZXMoaSksTT1NfHxpLmV4cGFuZGVkX21hcCYmZiBpbiBpLmV4cGFuZGVkX21hcDtmb3Iocz0wO3M8dS5sZW5ndGg7cysrKUUucHVzaCh1W3NdKX19Zz10aGlzLmNvbmRpdGlvbnNbbV07aWYoZyl7dC5fcGFyc2VkPSExO2lmKGMmJl8pZChjLGZ1bmN0aW9uKGUsdCl7dmFyIG49X1t0XS5uYW1lOyFEW25dJiZfW3RdLnRyaWdnZXI9PT1tJiZlJiZfW3RdJiYoRFtuXT0hMCxFLnB1c2gobikpfSk7ZWxzZSBmb3IobiBpbiBnKWlmKGcuaGFzT3duUHJvcGVydHkobikmJiFEW25dKXt4PWdbbl0sUz14JiYoIXgudWEmJiF4LnRlc3R8fHgudWEmJmUuVUFbeC51YV18fHgudGVzdCYmeC50ZXN0KGUsVCkpO2lmKFMpe0Rbbl09ITAsRS5wdXNoKG4pLGk9dGhpcy5nZXRNb2R1bGUobik7aWYoaSl7dT10aGlzLmdldFJlcXVpcmVzKGkpO2ZvcihzPTA7czx1Lmxlbmd0aDtzKyspRS5wdXNoKHVbc10pfX19fWlmKHQuc2tpbm5hYmxlKXtMPXRoaXMuc2tpbi5vdmVycmlkZXM7Zm9yKG4gaW4gWVVJLkVudi5hbGlhc2VzKVlVSS5FbnYuYWxpYXNlcy5oYXNPd25Qcm9wZXJ0eShuKSYmZS5BcnJheS5pbmRleE9mKFlVSS5FbnYuYWxpYXNlc1tuXSxtKT4tMSYmKEE9bik7aWYoTCYmKExbbV18fEEmJkxbQV0pKXtPPW0sTFtBXSYmKE89QSk7Zm9yKG49MDtuPExbT10ubGVuZ3RoO24rKylrPXRoaXMuX2FkZFNraW4oTFtPXVtuXSxtKSx0aGlzLmlzQ1NTTG9hZGVkKGssdGhpcy5fYm9vdCl8fEUucHVzaChrKX1lbHNlIGs9dGhpcy5fYWRkU2tpbih0aGlzLnNraW4uZGVmYXVsdFNraW4sbSksdGhpcy5pc0NTU0xvYWRlZChrLHRoaXMuX2Jvb3QpfHxFLnB1c2goayl9cmV0dXJuIHQuX3BhcnNlZD0hMSxNJiYodC5sYW5nJiYhdC5sYW5nUGFjayYmZS5JbnRsJiYobD1lLkludGwubG9va3VwQmVzdExhbmcodGhpcy5sYW5nfHxoLHQubGFuZyksYT10aGlzLmdldExhbmdQYWNrTmFtZShsLG0pLGEmJkUudW5zaGlmdChhKSksRS51bnNoaWZ0KGYpKSx0LmV4cGFuZGVkX21hcD12Lmhhc2goRSksdC5leHBhbmRlZD1wLmtleXModC5leHBhbmRlZF9tYXApLHQuZXhwYW5kZWR9LGlzQ1NTTG9hZGVkOmZ1bmN0aW9uKHQsbil7aWYoIXR8fCFZVUkuRW52LmNzc1N0YW1wRWx8fCFuJiZ0aGlzLmlnbm9yZVJlZ2lzdGVyZWQpcmV0dXJuITE7dmFyIHI9WVVJLkVudi5jc3NTdGFtcEVsLGk9ITEscz1ZVUkuRW52Ll9jc3NMb2FkZWRbdF0sbz1yLmN1cnJlbnRTdHlsZTtyZXR1cm4gcyE9PXVuZGVmaW5lZD9zOihyLmNsYXNzTmFtZT10LG98fChvPWUuY29uZmlnLmRvYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCkpLG8mJm8uZGlzcGxheT09PSJub25lIiYmKGk9ITApLHIuY2xhc3NOYW1lPSIiLFlVSS5FbnYuX2Nzc0xvYWRlZFt0XT1pLGkpfSxnZXRQcm92aWRlczpmdW5jdGlvbih0KXt2YXIgcj10aGlzLmdldE1vZHVsZSh0KSxpLHM7cmV0dXJuIHI/KHImJiFyLnByb3ZpZGVzJiYoaT17fSxzPXIuc3VwZXJzZWRlcyxzJiZ2LmVhY2gocyxmdW5jdGlvbih0KXtlLm1peChpLHRoaXMuZ2V0UHJvdmlkZXModCkpfSx0aGlzKSxpW3RdPSEwLHIucHJvdmlkZXM9aSksci5wcm92aWRlcyk6bn0sY2FsY3VsYXRlOmZ1bmN0aW9uKGUsdCl7aWYoZXx8dHx8dGhpcy5kaXJ0eSllJiZ0aGlzLl9jb25maWcoZSksdGhpcy5faW5pdHx8dGhpcy5fc2V0dXAoKSx0aGlzLl9leHBsb2RlKCksdGhpcy5hbGxvd1JvbGx1cD90aGlzLl9yb2xsdXAoKTp0aGlzLl9leHBsb2RlUm9sbHVwcygpLHRoaXMuX3JlZHVjZSgpLHRoaXMuX3NvcnQoKX0sX2FkZExhbmdQYWNrOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1uLm5hbWUscyxvLHU9dGhpcy5nZXRNb2R1bGVJbmZvKHIpO3JldHVybiB1fHwocz1TKG4ucGtnfHxpLHIsYSwhMCksbz17cGF0aDpzLGludGw6ITAsbGFuZ1BhY2s6ITAsZXh0Om4uZXh0LGdyb3VwOm4uZ3JvdXAsc3VwZXJzZWRlczpbXX0sbi5yb290JiYoby5yb290PW4ucm9vdCksbi5iYXNlJiYoby5iYXNlPW4uYmFzZSksbi5jb25maWdGbiYmKG8uY29uZmlnRm49bi5jb25maWdGbiksdGhpcy5hZGRNb2R1bGUobyxyKSx0JiYoZS5FbnYubGFuZz1lLkVudi5sYW5nfHx7fSxlLkVudi5sYW5nW3RdPWUuRW52LmxhbmdbdF18fHt9LGUuRW52LmxhbmdbdF1baV09ITApKSx0aGlzLmdldE1vZHVsZUluZm8ocil9LF9zZXR1cDpmdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kdWxlSW5mbyxuLHIsaSxvLHUsYTtmb3IobiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihvPXRbbl0sbyYmKG8ucmVxdWlyZXM9di5kZWR1cGUoby5yZXF1aXJlcyksby5sYW5nJiYoYT10aGlzLmdldExhbmdQYWNrTmFtZShoLG4pLHRoaXMuX2FkZExhbmdQYWNrKG51bGwsbyxhKSkpKTt1PXt9LHRoaXMuaWdub3JlUmVnaXN0ZXJlZHx8ZS5taXgodSxzLm1vZHMpLHRoaXMuaWdub3JlJiZlLm1peCh1LHYuaGFzaCh0aGlzLmlnbm9yZSkpO2ZvcihpIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShpKSYmZS5taXgodSx0aGlzLmdldFByb3ZpZGVzKGkpKTtpZih0aGlzLmZvcmNlKWZvcihyPTA7cjx0aGlzLmZvcmNlLmxlbmd0aDtyKyspdGhpcy5mb3JjZVtyXWluIHUmJmRlbGV0ZSB1W3RoaXMuZm9yY2Vbcl1dO2UubWl4KHRoaXMubG9hZGVkLHUpLHRoaXMuX2luaXQ9ITB9LGdldExhbmdQYWNrTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiJsYW5nLyIrdCsoZT8iXyIrZToiIil9LF9leHBsb2RlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZXF1aXJlZCxuLHIsaT17fSxzPXRoaXMsbyx1O3MuZGlydHk9ITEscy5fZXhwbG9kZVJvbGx1cHMoKSx0PXMucmVxdWlyZWQ7Zm9yKG8gaW4gdCl0Lmhhc093blByb3BlcnR5KG8pJiYoaVtvXXx8KGlbb109ITAsbj1zLmdldE1vZHVsZShvKSxuJiYodT1uLmV4cG91bmQsdSYmKHRbdV09cy5nZXRNb2R1bGUodSkscj1zLmdldFJlcXVpcmVzKHRbdV0pLGUubWl4KHQsdi5oYXNoKHIpKSkscj1zLmdldFJlcXVpcmVzKG4pLGUubWl4KHQsdi5oYXNoKHIpKSkpKX0sX3BhdHRlcm5UZXN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaW5kZXhPZih0KT4tMX0sZ2V0TW9kdWxlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO3ZhciBuLHIsaSxzPXRoaXMuZ2V0TW9kdWxlSW5mbyh0KSxvPXRoaXMucGF0dGVybnM7aWYoIXN8fHMmJnMuZXh0KWZvcihpIGluIG8paWYoby5oYXNPd25Qcm9wZXJ0eShpKSl7bj1vW2ldLG4udGVzdHx8KG4udGVzdD10aGlzLl9wYXR0ZXJuVGVzdCk7aWYobi50ZXN0KHQsaSkpe3I9bjticmVha319cmV0dXJuIHM/ciYmcyYmci5jb25maWdGbiYmIXMuY29uZmlnRm4mJihzLmNvbmZpZ0ZuPXIuY29uZmlnRm4scy5jb25maWdGbihzKSk6ciYmKG4uYWN0aW9uP24uYWN0aW9uLmNhbGwodGhpcyx0LGkpOihzPXRoaXMuYWRkTW9kdWxlKGUubWVyZ2Uocix7dGVzdDp2b2lkIDAsdGVtcDohMH0pLHQpLHIuY29uZmlnRm4mJihzLmNvbmZpZ0ZuPXIuY29uZmlnRm4pKSksc30sX3JvbGx1cDpmdW5jdGlvbigpe30sX3JlZHVjZTpmdW5jdGlvbihlKXtlPWV8fHRoaXMucmVxdWlyZWQ7dmFyIHQsbixyLGkscz10aGlzLmxvYWRUeXBlLG89dGhpcy5pZ25vcmU/di5oYXNoKHRoaXMuaWdub3JlKTohMTtmb3IodCBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkodCkpe2k9dGhpcy5nZXRNb2R1bGUodCksKCh0aGlzLmxvYWRlZFt0XXx8d1t0XSkmJiF0aGlzLmZvcmNlTWFwW3RdJiYhdGhpcy5pZ25vcmVSZWdpc3RlcmVkfHxzJiZpJiZpLnR5cGUhPT1zKSYmZGVsZXRlIGVbdF0sbyYmb1t0XSYmZGVsZXRlIGVbdF0scj1pJiZpLnN1cGVyc2VkZXM7aWYocilmb3Iobj0wO248ci5sZW5ndGg7bisrKXJbbl1pbiBlJiZkZWxldGUgZVtyW25dXX1yZXR1cm4gZX0sX2ZpbmlzaDpmdW5jdGlvbihlLHQpe20ucnVubmluZz0hMTt2YXIgbj10aGlzLm9uRW5kO24mJm4uY2FsbCh0aGlzLmNvbnRleHQse21zZzplLGRhdGE6dGhpcy5kYXRhLHN1Y2Nlc3M6dH0pLHRoaXMuX2NvbnRpbnVlKCl9LF9vblN1Y2Nlc3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5tZXJnZSh0LnNraXBwZWQpLHIsaT1bXSxzPXQucmVxdWlyZVJlZ2lzdHJhdGlvbixvLHUsZixsO2ZvcihmIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShmKSYmZGVsZXRlIHQuaW5zZXJ0ZWRbZl07dC5za2lwcGVkPXt9O2ZvcihmIGluIHQuaW5zZXJ0ZWQpdC5pbnNlcnRlZC5oYXNPd25Qcm9wZXJ0eShmKSYmKGw9dC5nZXRNb2R1bGUoZiksIWx8fCFzfHxsLnR5cGUhPT1hfHxmIGluIFlVSS5FbnYubW9kcz9lLm1peCh0LmxvYWRlZCx0LmdldFByb3ZpZGVzKGYpKTppLnB1c2goZikpO3I9dC5vblN1Y2Nlc3MsdT1pLmxlbmd0aD8ibm90cmVnaXN0ZXJlZCI6InN1Y2Nlc3MiLG89IWkubGVuZ3RoLHImJnIuY2FsbCh0LmNvbnRleHQse21zZzp1LGRhdGE6dC5kYXRhLHN1Y2Nlc3M6byxmYWlsZWQ6aSxza2lwcGVkOm59KSx0Ll9maW5pc2godSxvKX0sX29uUHJvZ3Jlc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuO2lmKGUuZGF0YSYmZS5kYXRhLmxlbmd0aClmb3Iobj0wO248ZS5kYXRhLmxlbmd0aDtuKyspZS5kYXRhW25dPXQuZ2V0TW9kdWxlKGUuZGF0YVtuXS5uYW1lKTt0Lm9uUHJvZ3Jlc3MmJnQub25Qcm9ncmVzcy5jYWxsKHQuY29udGV4dCx7bmFtZTplLnVybCxkYXRhOmUuZGF0YX0pfSxfb25GYWlsdXJlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMub25GYWlsdXJlLG49W10scj0wLGk9ZS5lcnJvcnMubGVuZ3RoO2ZvcihyO3I8aTtyKyspbi5wdXNoKGUuZXJyb3JzW3JdLmVycm9yKTtuPW4uam9pbigiLCIpLHQmJnQuY2FsbCh0aGlzLmNvbnRleHQse21zZzpuLGRhdGE6dGhpcy5kYXRhLHN1Y2Nlc3M6ITF9KSx0aGlzLl9maW5pc2gobiwhMSl9LF9vblRpbWVvdXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5vblRpbWVvdXQ7dCYmdC5jYWxsKHRoaXMuY29udGV4dCx7bXNnOiJ0aW1lb3V0IixkYXRhOnRoaXMuZGF0YSxzdWNjZXNzOiExLHRyYW5zYWN0aW9uOmV9KX0sX3NvcnQ6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMucmVxdWlyZWQsbj17fTt0aGlzLnNvcnRlZD1bXTtmb3IoZSBpbiB0KSFuW2VdJiZ0Lmhhc093blByb3BlcnR5KGUpJiYKdGhpcy5fdmlzaXQoZSxuKX0sX3Zpc2l0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbyx1LGEsZixsO3RbZV09ITAsbj10aGlzLnJlcXVpcmVkLGk9dGhpcy5tb2R1bGVJbmZvW2VdLHI9dGhpcy5jb25kaXRpb25zW2VdfHx7fTtpZihpKXtvPWkuZXhwYW5kZWR8fGkucmVxdWlyZXM7Zm9yKGY9MCxsPW8ubGVuZ3RoO2Y8bDsrK2Ypcz1vW2ZdLHU9cltzXSxhPXUmJighdS53aGVufHx1LndoZW49PT0iYWZ0ZXIiKSxuW3NdJiYhdFtzXSYmIWEmJnRoaXMuX3Zpc2l0KHMsdCl9dGhpcy5zb3J0ZWQucHVzaChlKX0sX2luc2VydDpmdW5jdGlvbih0LG4scixpKXt0JiZ0aGlzLl9jb25maWcodCk7dmFyIHM9dGhpcy5yZXNvbHZlKCFpKSxvPXRoaXMsZj0wLGw9MCxjPXt9LGgscDtvLl9yZWZldGNoPVtdLHImJihzW3I9PT1hP3U6YV09W10pLG8uZmV0Y2hDU1N8fChzLmNzcz1bXSkscy5qcy5sZW5ndGgmJmYrKyxzLmNzcy5sZW5ndGgmJmYrKyxwPWZ1bmN0aW9uKHQpe2wrKzt2YXIgbj17fSxyPTAsaT0wLHM9IiIsdSxhLHA7aWYodCYmdC5lcnJvcnMpZm9yKHI9MDtyPHQuZXJyb3JzLmxlbmd0aDtyKyspdC5lcnJvcnNbcl0ucmVxdWVzdD9zPXQuZXJyb3JzW3JdLnJlcXVlc3QudXJsOnM9dC5lcnJvcnNbcl0sbltzXT1zO2lmKHQmJnQuZGF0YSYmdC5kYXRhLmxlbmd0aCYmdC50eXBlPT09InN1Y2Nlc3MiKWZvcihyPTA7cjx0LmRhdGEubGVuZ3RoO3IrKyl7by5pbnNlcnRlZFt0LmRhdGFbcl0ubmFtZV09ITA7aWYodC5kYXRhW3JdLmxhbmd8fHQuZGF0YVtyXS5za2lubmFibGUpZGVsZXRlIG8uaW5zZXJ0ZWRbdC5kYXRhW3JdLm5hbWVdLG8uX3JlZmV0Y2gucHVzaCh0LmRhdGFbcl0ubmFtZSl9aWYobD09PWYpe28uX2xvYWRpbmc9bnVsbDtpZihvLl9yZWZldGNoLmxlbmd0aCl7Zm9yKHI9MDtyPG8uX3JlZmV0Y2gubGVuZ3RoO3IrKyl7aD1vLmdldFJlcXVpcmVzKG8uZ2V0TW9kdWxlKG8uX3JlZmV0Y2hbcl0pKTtmb3IoaT0wO2k8aC5sZW5ndGg7aSsrKW8uaW5zZXJ0ZWRbaFtpXV18fChjW2hbaV1dPWhbaV0pfWM9ZS5PYmplY3Qua2V5cyhjKTtpZihjLmxlbmd0aCl7by5yZXF1aXJlKGMpLHA9by5yZXNvbHZlKCEwKTtpZihwLmNzc01vZHMubGVuZ3RoKXtmb3Iocj0wO3I8cC5jc3NNb2RzLmxlbmd0aDtyKyspYT1wLmNzc01vZHNbcl0ubmFtZSxkZWxldGUgWVVJLkVudi5fY3NzTG9hZGVkW2FdLG8uaXNDU1NMb2FkZWQoYSkmJihvLmluc2VydGVkW2FdPSEwLGRlbGV0ZSBvLnJlcXVpcmVkW2FdKTtvLnNvcnRlZD1bXSxvLl9zb3J0KCl9dD1udWxsLG8uX2luc2VydCgpfX10JiZ0LmZuJiYodT10LmZuLGRlbGV0ZSB0LmZuLHUuY2FsbChvLHQpKX19LHRoaXMuX2xvYWRpbmc9ITA7aWYoIXMuanMubGVuZ3RoJiYhcy5jc3MubGVuZ3RoKXtsPS0xLHAoe2ZuOm8uX29uU3VjY2Vzc30pO3JldHVybn1zLmNzcy5sZW5ndGgmJmUuR2V0LmNzcyhzLmNzcyx7ZGF0YTpzLmNzc01vZHMsYXR0cmlidXRlczpvLmNzc0F0dHJpYnV0ZXMsaW5zZXJ0QmVmb3JlOm8uaW5zZXJ0QmVmb3JlLGNoYXJzZXQ6by5jaGFyc2V0LHRpbWVvdXQ6by50aW1lb3V0LGNvbnRleHQ6byxvblByb2dyZXNzOmZ1bmN0aW9uKGUpe28uX29uUHJvZ3Jlc3MuY2FsbChvLGUpfSxvblRpbWVvdXQ6ZnVuY3Rpb24oZSl7by5fb25UaW1lb3V0LmNhbGwobyxlKX0sb25TdWNjZXNzOmZ1bmN0aW9uKGUpe2UudHlwZT0ic3VjY2VzcyIsZS5mbj1vLl9vblN1Y2Nlc3MscC5jYWxsKG8sZSl9LG9uRmFpbHVyZTpmdW5jdGlvbihlKXtlLnR5cGU9ImZhaWx1cmUiLGUuZm49by5fb25GYWlsdXJlLHAuY2FsbChvLGUpfX0pLHMuanMubGVuZ3RoJiZlLkdldC5qcyhzLmpzLHtkYXRhOnMuanNNb2RzLGluc2VydEJlZm9yZTpvLmluc2VydEJlZm9yZSxhdHRyaWJ1dGVzOm8uanNBdHRyaWJ1dGVzLGNoYXJzZXQ6by5jaGFyc2V0LHRpbWVvdXQ6by50aW1lb3V0LGF1dG9wdXJnZTohMSxjb250ZXh0Om8sYXN5bmM6by5hc3luYyxvblByb2dyZXNzOmZ1bmN0aW9uKGUpe28uX29uUHJvZ3Jlc3MuY2FsbChvLGUpfSxvblRpbWVvdXQ6ZnVuY3Rpb24oZSl7by5fb25UaW1lb3V0LmNhbGwobyxlKX0sb25TdWNjZXNzOmZ1bmN0aW9uKGUpe2UudHlwZT0ic3VjY2VzcyIsZS5mbj1vLl9vblN1Y2Nlc3MscC5jYWxsKG8sZSl9LG9uRmFpbHVyZTpmdW5jdGlvbihlKXtlLnR5cGU9ImZhaWx1cmUiLGUuZm49by5fb25GYWlsdXJlLHAuY2FsbChvLGUpfX0pfSxfY29udGludWU6ZnVuY3Rpb24oKXshbS5ydW5uaW5nJiZtLnNpemUoKT4wJiYobS5ydW5uaW5nPSEwLG0ubmV4dCgpKCkpfSxpbnNlcnQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXRoaXMscz1lLm1lcmdlKHRoaXMpO2RlbGV0ZSBzLnJlcXVpcmUsZGVsZXRlIHMuZGlydHksbS5hZGQoZnVuY3Rpb24oKXtpLl9pbnNlcnQocyx0LG4scil9KSx0aGlzLl9jb250aW51ZSgpfSxsb2FkTmV4dDpmdW5jdGlvbigpe3JldHVybn0sX2ZpbHRlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5maWx0ZXIsaT10JiZ0IGluIHRoaXMuZmlsdGVycyxzPWkmJnRoaXMuZmlsdGVyc1t0XSxvPW58fCh0aGlzLmdldE1vZHVsZUluZm8odCl8fHt9KS5ncm91cHx8bnVsbDtyZXR1cm4gbyYmdGhpcy5ncm91cHNbb10mJnRoaXMuZ3JvdXBzW29dLmZpbHRlciYmKHM9dGhpcy5ncm91cHNbb10uZmlsdGVyLGk9ITApLGUmJihpJiYocj1iLmlzU3RyaW5nKHMpP3RoaXMuRklMVEVSX0RFRlNbcy50b1VwcGVyQ2FzZSgpXXx8bnVsbDpzKSxyJiYoZT1lLnJlcGxhY2UobmV3IFJlZ0V4cChyLnNlYXJjaEV4cCwiZyIpLHIucmVwbGFjZVN0cikpKSxlfSxfdXJsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fZmlsdGVyKChufHx0aGlzLmJhc2V8fCIiKStlLHQpfSxyZXNvbHZlOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcyxzPXtqczpbXSxqc01vZHM6W10sY3NzOltdLGNzc01vZHM6W119LG87KHIuc2tpbi5vdmVycmlkZXN8fHIuc2tpbi5kZWZhdWx0U2tpbiE9PWx8fHIuaWdub3JlUmVnaXN0ZXJlZCkmJnIuX3Jlc2V0TW9kdWxlcygpLGUmJnIuY2FsY3VsYXRlKCksdD10fHxyLnNvcnRlZCxvPWZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWUuZ3JvdXAmJnIuZ3JvdXBzW2UuZ3JvdXBdfHxuLGk7dC5hc3luYz09PSExJiYoZS5hc3luYz10LmFzeW5jKSxpPWUuZnVsbHBhdGg/ci5fZmlsdGVyKGUuZnVsbHBhdGgsZS5uYW1lKTpyLl91cmwoZS5wYXRoLGUubmFtZSx0LmJhc2V8fGUuYmFzZSk7aWYoZS5hdHRyaWJ1dGVzfHxlLmFzeW5jPT09ITEpaT17dXJsOmksYXN5bmM6ZS5hc3luY30sZS5hdHRyaWJ1dGVzJiYoaS5hdHRyaWJ1dGVzPWUuYXR0cmlidXRlcyk7c1tlLnR5cGVdLnB1c2goaSksc1tlLnR5cGUrIk1vZHMiXS5wdXNoKGUpfX07dmFyIGY9ci5pZ25vcmVSZWdpc3RlcmVkP3t9OnIuaW5zZXJ0ZWQsYz17fSxoLHAsZCx2LG0sZyx5LGI7Zm9yKGI9MCx5PXQubGVuZ3RoO2I8eTtiKyspe2c9ci5nZXRNb2R1bGUodFtiXSk7aWYoIWd8fGZbZy5uYW1lXSljb250aW51ZTttPXIuZ3JvdXBzW2cuZ3JvdXBdLGQ9ci5jb21ib0Jhc2U7aWYobSl7aWYoIW0uY29tYmluZXx8Zy5mdWxscGF0aCl7byhnKTtjb250aW51ZX1nLmNvbWJpbmU9ITAsdHlwZW9mIG0ucm9vdD09InN0cmluZyImJihnLnJvb3Q9bS5yb290KSxkPW0uY29tYm9CYXNlfHxkLHY9bS5jb21ib1NlcCxoPW0ubWF4VVJMTGVuZ3RofWVsc2UgaWYoIXIuY29tYmluZSl7byhnKTtjb250aW51ZX1pZighZy5jb21iaW5lJiZnLmV4dCl7byhnKTtjb250aW51ZX1jW2RdPWNbZF18fHtqczpbXSxqc01vZHM6W10sY3NzOltdLGNzc01vZHM6W119LHA9Y1tkXSxwLmdyb3VwPWcuZ3JvdXAscC5jb21ib1NlcD12fHxyLmNvbWJvU2VwLHAubWF4VVJMTGVuZ3RoPWh8fHIubWF4VVJMTGVuZ3RoLHBbZy50eXBlKyJNb2RzIl0ucHVzaChnKX12YXIgdyxFLFMseCxULE4sQztmb3IoZCBpbiBjKWlmKGMuaGFzT3duUHJvcGVydHkoZCkpe3A9Y1tkXSx2PXAuY29tYm9TZXAsaD1wLm1heFVSTExlbmd0aDtmb3IoQyBpbiBwKWlmKEM9PT1hfHxDPT09dSl7RT1wW0MrIk1vZHMiXSxUPVtdO2ZvcihiPTAseT1FLmxlbmd0aDtiPHk7Yis9MSlnPUVbYl0sTj0odHlwZW9mIGcucm9vdD09InN0cmluZyI/Zy5yb290OnIucm9vdCkrKGcucGF0aHx8Zy5mdWxscGF0aCksVC5wdXNoKHIuX2ZpbHRlcihOLGcubmFtZSkpO1M9ZCtULmpvaW4odikseD1TLmxlbmd0aCxoPD1kLmxlbmd0aCYmKGg9aSk7aWYoVC5sZW5ndGgpaWYoeD5oKXt3PVtdO2ZvcihiPTAseT1ULmxlbmd0aDtiPHk7YisrKXcucHVzaChUW2JdKSxTPWQrdy5qb2luKHYpLFMubGVuZ3RoPmgmJihOPXcucG9wKCksUz1kK3cuam9pbih2KSxzW0NdLnB1c2goci5fZmlsdGVyKFMsbnVsbCxwLmdyb3VwKSksdz1bXSxOJiZ3LnB1c2goTikpO3cubGVuZ3RoJiYoUz1kK3cuam9pbih2KSxzW0NdLnB1c2goci5fZmlsdGVyKFMsbnVsbCxwLmdyb3VwKSkpfWVsc2Ugc1tDXS5wdXNoKHIuX2ZpbHRlcihTLG51bGwscC5ncm91cCkpO3NbQysiTW9kcyJdPXNbQysiTW9kcyJdLmNvbmNhdChFKX19cmV0dXJuIHN9LGxvYWQ6ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO3ZhciB0PXRoaXMsbj10LnJlc29sdmUoITApO3QuZGF0YT1uLHQub25FbmQ9ZnVuY3Rpb24oKXtlLmFwcGx5KHQuY29udGV4dHx8dCxhcmd1bWVudHMpfSx0Lmluc2VydCgpfX19LCIzLjE3LjIiLHtyZXF1aXJlczpbImdldCIsImZlYXR1cmVzIl19KSxZVUkuYWRkKCJsb2FkZXItcm9sbHVwIixmdW5jdGlvbihlLHQpe2UuTG9hZGVyLnByb3RvdHlwZS5fcm9sbHVwPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaT10aGlzLnJlcXVpcmVkLHMsbz10aGlzLm1vZHVsZUluZm8sdSxhLGY7aWYodGhpcy5kaXJ0eXx8IXRoaXMucm9sbHVwcyl7dGhpcy5yb2xsdXBzPXt9O2ZvcihlIGluIG8pby5oYXNPd25Qcm9wZXJ0eShlKSYmKG49dGhpcy5nZXRNb2R1bGUoZSksbiYmbi5yb2xsdXAmJih0aGlzLnJvbGx1cHNbZV09bikpfWZvcig7Oyl7dT0hMTtmb3IoZSBpbiB0aGlzLnJvbGx1cHMpaWYodGhpcy5yb2xsdXBzLmhhc093blByb3BlcnR5KGUpJiYhaVtlXSYmKCF0aGlzLmxvYWRlZFtlXXx8dGhpcy5mb3JjZU1hcFtlXSkpe249dGhpcy5nZXRNb2R1bGUoZSkscj1uLnN1cGVyc2VkZXN8fFtdLHM9ITE7aWYoIW4ucm9sbHVwKWNvbnRpbnVlO2E9MDtmb3IodD0wO3Q8ci5sZW5ndGg7dCsrKXtmPW9bclt0XV07aWYodGhpcy5sb2FkZWRbclt0XV0mJiF0aGlzLmZvcmNlTWFwW3JbdF1dKXtzPSExO2JyZWFrfWlmKGlbclt0XV0mJm4udHlwZT09PWYudHlwZSl7YSsrLHM9YT49bi5yb2xsdXA7aWYocylicmVha319cyYmKGlbZV09ITAsdT0hMCx0aGlzLmdldFJlcXVpcmVzKG4pKX1pZighdSlicmVha319fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJsb2FkZXItYmFzZSJdfSksWVVJLmFkZCgibG9hZGVyLXl1aTMiLGZ1bmN0aW9uKGUsdCl7WVVJLkVudltlLnZlcnNpb25dLm1vZHVsZXM9WVVJLkVudltlLnZlcnNpb25dLm1vZHVsZXN8fHt9LGUubWl4KFlVSS5FbnZbZS52ZXJzaW9uXS5tb2R1bGVzLHsiYWxpZ24tcGx1Z2luIjp7cmVxdWlyZXM6WyJub2RlLXNjcmVlbiIsIm5vZGUtcGx1Z2luaG9zdCJdfSxhbmltOnt1c2U6WyJhbmltLWJhc2UiLCJhbmltLWNvbG9yIiwiYW5pbS1jdXJ2ZSIsImFuaW0tZWFzaW5nIiwiYW5pbS1ub2RlLXBsdWdpbiIsImFuaW0tc2Nyb2xsIiwiYW5pbS14eSJdfSwiYW5pbS1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlLWJhc2UiLCJub2RlLXN0eWxlIiwiY29sb3ItYmFzZSJdfSwiYW5pbS1jb2xvciI6e3JlcXVpcmVzOlsiYW5pbS1iYXNlIl19LCJhbmltLWN1cnZlIjp7cmVxdWlyZXM6WyJhbmltLXh5Il19LCJhbmltLWVhc2luZyI6e3JlcXVpcmVzOlsiYW5pbS1iYXNlIl19LCJhbmltLW5vZGUtcGx1Z2luIjp7cmVxdWlyZXM6WyJub2RlLXBsdWdpbmhvc3QiLCJhbmltLWJhc2UiXX0sImFuaW0tc2Nyb2xsIjp7cmVxdWlyZXM6WyJhbmltLWJhc2UiXX0sImFuaW0tc2hhcGUiOntyZXF1aXJlczpbImFuaW0tYmFzZSIsImFuaW0tZWFzaW5nIiwiYW5pbS1jb2xvciIKLCJtYXRyaXgiXX0sImFuaW0tc2hhcGUtdHJhbnNmb3JtIjp7dXNlOlsiYW5pbS1zaGFwZSJdfSwiYW5pbS14eSI6e3JlcXVpcmVzOlsiYW5pbS1iYXNlIiwibm9kZS1zY3JlZW4iXX0sYXBwOnt1c2U6WyJhcHAtYmFzZSIsImFwcC1jb250ZW50IiwiYXBwLXRyYW5zaXRpb25zIiwibGF6eS1tb2RlbC1saXN0IiwibW9kZWwiLCJtb2RlbC1saXN0IiwibW9kZWwtc3luYy1yZXN0IiwibW9kZWwtc3luYy1sb2NhbCIsInJvdXRlciIsInZpZXciLCJ2aWV3LW5vZGUtbWFwIl19LCJhcHAtYmFzZSI6e3JlcXVpcmVzOlsiY2xhc3NuYW1lbWFuYWdlciIsInBqYXgtYmFzZSIsInJvdXRlciIsInZpZXciXX0sImFwcC1jb250ZW50Ijp7cmVxdWlyZXM6WyJhcHAtYmFzZSIsInBqYXgtY29udGVudCJdfSwiYXBwLXRyYW5zaXRpb25zIjp7cmVxdWlyZXM6WyJhcHAtYmFzZSJdfSwiYXBwLXRyYW5zaXRpb25zLWNzcyI6e3R5cGU6ImNzcyJ9LCJhcHAtdHJhbnNpdGlvbnMtbmF0aXZlIjp7Y29uZGl0aW9uOntuYW1lOiJhcHAtdHJhbnNpdGlvbnMtbmF0aXZlIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQ/dC5kb2N1bWVudEVsZW1lbnQ6bnVsbDtyZXR1cm4gbiYmbi5zdHlsZT8iTW96VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwiV2Via2l0VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwidHJhbnNpdGlvbiJpbiBuLnN0eWxlOiExfSx0cmlnZ2VyOiJhcHAtdHJhbnNpdGlvbnMifSxyZXF1aXJlczpbImFwcC10cmFuc2l0aW9ucyIsImFwcC10cmFuc2l0aW9ucy1jc3MiLCJwYXJhbGxlbCIsInRyYW5zaXRpb24iXX0sImFycmF5LWV4dHJhcyI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImFycmF5LWludm9rZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sYXJyYXlsaXN0OntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJhcnJheWxpc3QtYWRkIjp7cmVxdWlyZXM6WyJhcnJheWxpc3QiXX0sImFycmF5bGlzdC1maWx0ZXIiOntyZXF1aXJlczpbImFycmF5bGlzdCJdfSxhcnJheXNvcnQ6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImFzeW5jLXF1ZXVlIjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20iXX0sYXR0cmlidXRlOnt1c2U6WyJhdHRyaWJ1dGUtYmFzZSIsImF0dHJpYnV0ZS1jb21wbGV4Il19LCJhdHRyaWJ1dGUtYmFzZSI6e3JlcXVpcmVzOlsiYXR0cmlidXRlLWNvcmUiLCJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImF0dHJpYnV0ZS1leHRyYXMiXX0sImF0dHJpYnV0ZS1jb21wbGV4Ijp7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtYmFzZSJdfSwiYXR0cmlidXRlLWNvcmUiOntyZXF1aXJlczpbIm9vcCJdfSwiYXR0cmlidXRlLWV2ZW50cyI6e3VzZTpbImF0dHJpYnV0ZS1vYnNlcnZhYmxlIl19LCJhdHRyaWJ1dGUtZXh0cmFzIjp7cmVxdWlyZXM6WyJvb3AiXX0sImF0dHJpYnV0ZS1vYnNlcnZhYmxlIjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20iXX0sYXV0b2NvbXBsZXRlOnt1c2U6WyJhdXRvY29tcGxldGUtYmFzZSIsImF1dG9jb21wbGV0ZS1zb3VyY2VzIiwiYXV0b2NvbXBsZXRlLWxpc3QiLCJhdXRvY29tcGxldGUtcGx1Z2luIl19LCJhdXRvY29tcGxldGUtYmFzZSI6e29wdGlvbmFsOlsiYXV0b2NvbXBsZXRlLXNvdXJjZXMiXSxyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsImJhc2UtYnVpbGQiLCJlc2NhcGUiLCJldmVudC12YWx1ZWNoYW5nZSIsIm5vZGUtYmFzZSJdfSwiYXV0b2NvbXBsZXRlLWZpbHRlcnMiOntyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsInRleHQtd29yZGJyZWFrIl19LCJhdXRvY29tcGxldGUtZmlsdGVycy1hY2NlbnRmb2xkIjp7cmVxdWlyZXM6WyJhcnJheS1leHRyYXMiLCJ0ZXh0LWFjY2VudGZvbGQiLCJ0ZXh0LXdvcmRicmVhayJdfSwiYXV0b2NvbXBsZXRlLWhpZ2hsaWdodGVycyI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiaGlnaGxpZ2h0LWJhc2UiXX0sImF1dG9jb21wbGV0ZS1oaWdobGlnaHRlcnMtYWNjZW50Zm9sZCI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiaGlnaGxpZ2h0LWFjY2VudGZvbGQiXX0sImF1dG9jb21wbGV0ZS1saXN0Ijp7YWZ0ZXI6WyJhdXRvY29tcGxldGUtc291cmNlcyJdLGxhbmc6WyJlbiIsImVzIiwiaHUiLCJpdCJdLHJlcXVpcmVzOlsiYXV0b2NvbXBsZXRlLWJhc2UiLCJldmVudC1yZXNpemUiLCJub2RlLXNjcmVlbiIsInNlbGVjdG9yLWNzczMiLCJzaGltLXBsdWdpbiIsIndpZGdldCIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1wb3NpdGlvbi1hbGlnbiJdLHNraW5uYWJsZTohMH0sImF1dG9jb21wbGV0ZS1saXN0LWtleXMiOntjb25kaXRpb246e25hbWU6ImF1dG9jb21wbGV0ZS1saXN0LWtleXMiLHRlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIWUuVUEuaW9zJiYhZS5VQS5hbmRyb2lkfSx0cmlnZ2VyOiJhdXRvY29tcGxldGUtbGlzdCJ9LHJlcXVpcmVzOlsiYXV0b2NvbXBsZXRlLWxpc3QiLCJiYXNlLWJ1aWxkIl19LCJhdXRvY29tcGxldGUtcGx1Z2luIjp7cmVxdWlyZXM6WyJhdXRvY29tcGxldGUtbGlzdCIsIm5vZGUtcGx1Z2luaG9zdCJdfSwiYXV0b2NvbXBsZXRlLXNvdXJjZXMiOntvcHRpb25hbDpbImlvLWJhc2UiLCJqc29uLXBhcnNlIiwianNvbnAiLCJ5cWwiXSxyZXF1aXJlczpbImF1dG9jb21wbGV0ZS1iYXNlIl19LGF4ZXM6e3VzZTpbImF4aXMtbnVtZXJpYyIsImF4aXMtY2F0ZWdvcnkiLCJheGlzLXRpbWUiLCJheGlzLXN0YWNrZWQiXX0sImF4ZXMtYmFzZSI6e3VzZTpbImF4aXMtbnVtZXJpYy1iYXNlIiwiYXhpcy1jYXRlZ29yeS1iYXNlIiwiYXhpcy10aW1lLWJhc2UiLCJheGlzLXN0YWNrZWQtYmFzZSJdfSxheGlzOntyZXF1aXJlczpbImRvbSIsIndpZGdldCIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1zdGFjayIsImdyYXBoaWNzIiwiYXhpcy1iYXNlIl19LCJheGlzLWJhc2UiOntyZXF1aXJlczpbImNsYXNzbmFtZW1hbmFnZXIiLCJkYXRhdHlwZS1udW1iZXIiLCJkYXRhdHlwZS1kYXRlIiwiYmFzZSIsImV2ZW50LWN1c3RvbSJdfSwiYXhpcy1jYXRlZ29yeSI6e3JlcXVpcmVzOlsiYXhpcyIsImF4aXMtY2F0ZWdvcnktYmFzZSJdfSwiYXhpcy1jYXRlZ29yeS1iYXNlIjp7cmVxdWlyZXM6WyJheGlzLWJhc2UiXX0sImF4aXMtbnVtZXJpYyI6e3JlcXVpcmVzOlsiYXhpcyIsImF4aXMtbnVtZXJpYy1iYXNlIl19LCJheGlzLW51bWVyaWMtYmFzZSI6e3JlcXVpcmVzOlsiYXhpcy1iYXNlIl19LCJheGlzLXN0YWNrZWQiOntyZXF1aXJlczpbImF4aXMtbnVtZXJpYyIsImF4aXMtc3RhY2tlZC1iYXNlIl19LCJheGlzLXN0YWNrZWQtYmFzZSI6e3JlcXVpcmVzOlsiYXhpcy1udW1lcmljLWJhc2UiXX0sImF4aXMtdGltZSI6e3JlcXVpcmVzOlsiYXhpcyIsImF4aXMtdGltZS1iYXNlIl19LCJheGlzLXRpbWUtYmFzZSI6e3JlcXVpcmVzOlsiYXhpcy1iYXNlIl19LGJhc2U6e3VzZTpbImJhc2UtYmFzZSIsImJhc2UtcGx1Z2luaG9zdCIsImJhc2UtYnVpbGQiXX0sImJhc2UtYmFzZSI6e3JlcXVpcmVzOlsiYXR0cmlidXRlLWJhc2UiLCJiYXNlLWNvcmUiLCJiYXNlLW9ic2VydmFibGUiXX0sImJhc2UtYnVpbGQiOntyZXF1aXJlczpbImJhc2UtYmFzZSJdfSwiYmFzZS1jb3JlIjp7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtY29yZSJdfSwiYmFzZS1vYnNlcnZhYmxlIjp7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImJhc2UtY29yZSJdfSwiYmFzZS1wbHVnaW5ob3N0Ijp7cmVxdWlyZXM6WyJiYXNlLWJhc2UiLCJwbHVnaW5ob3N0Il19LGJ1dHRvbjp7cmVxdWlyZXM6WyJidXR0b24tY29yZSIsImNzc2J1dHRvbiIsIndpZGdldCJdfSwiYnV0dG9uLWNvcmUiOntyZXF1aXJlczpbImF0dHJpYnV0ZS1jb3JlIiwiY2xhc3NuYW1lbWFuYWdlciIsIm5vZGUtYmFzZSIsImVzY2FwZSJdfSwiYnV0dG9uLWdyb3VwIjp7cmVxdWlyZXM6WyJidXR0b24tcGx1Z2luIiwiY3NzYnV0dG9uIiwid2lkZ2V0Il19LCJidXR0b24tcGx1Z2luIjp7cmVxdWlyZXM6WyJidXR0b24tY29yZSIsImNzc2J1dHRvbiIsIm5vZGUtcGx1Z2luaG9zdCJdfSxjYWNoZTp7dXNlOlsiY2FjaGUtYmFzZSIsImNhY2hlLW9mZmxpbmUiLCJjYWNoZS1wbHVnaW4iXX0sImNhY2hlLWJhc2UiOntyZXF1aXJlczpbImJhc2UiXX0sImNhY2hlLW9mZmxpbmUiOntyZXF1aXJlczpbImNhY2hlLWJhc2UiLCJqc29uIl19LCJjYWNoZS1wbHVnaW4iOntyZXF1aXJlczpbInBsdWdpbiIsImNhY2hlLWJhc2UiXX0sY2FsZW5kYXI6e3JlcXVpcmVzOlsiY2FsZW5kYXItYmFzZSIsImNhbGVuZGFybmF2aWdhdG9yIl0sc2tpbm5hYmxlOiEwfSwiY2FsZW5kYXItYmFzZSI6e2xhbmc6WyJkZSIsImVuIiwiZXMiLCJlcy1BUiIsImZyIiwiaHUiLCJpdCIsImphIiwibmItTk8iLCJubCIsInB0LUJSIiwicnUiLCJ6aC1IYW5zIiwiemgtSGFucy1DTiIsInpoLUhhbnQiLCJ6aC1IYW50LUhLIiwiemgtSEFOVC1UVyJdLHJlcXVpcmVzOlsid2lkZ2V0IiwiZGF0YXR5cGUtZGF0ZSIsImRhdGF0eXBlLWRhdGUtbWF0aCIsImNzc2dyaWRzIl0sc2tpbm5hYmxlOiEwfSxjYWxlbmRhcm5hdmlnYXRvcjp7cmVxdWlyZXM6WyJwbHVnaW4iLCJjbGFzc25hbWVtYW5hZ2VyIiwiZGF0YXR5cGUtZGF0ZSIsIm5vZGUiXSxza2lubmFibGU6ITB9LGNoYXJ0czp7dXNlOlsiY2hhcnRzLWJhc2UiXX0sImNoYXJ0cy1iYXNlIjp7cmVxdWlyZXM6WyJkb20iLCJldmVudC1tb3VzZWVudGVyIiwiZXZlbnQtdG91Y2giLCJncmFwaGljcy1ncm91cCIsImF4ZXMiLCJzZXJpZXMtcGllIiwic2VyaWVzLWxpbmUiLCJzZXJpZXMtbWFya2VyIiwic2VyaWVzLWFyZWEiLCJzZXJpZXMtc3BsaW5lIiwic2VyaWVzLWNvbHVtbiIsInNlcmllcy1iYXIiLCJzZXJpZXMtYXJlYXNwbGluZSIsInNlcmllcy1jb21ibyIsInNlcmllcy1jb21ib3NwbGluZSIsInNlcmllcy1saW5lLXN0YWNrZWQiLCJzZXJpZXMtbWFya2VyLXN0YWNrZWQiLCJzZXJpZXMtYXJlYS1zdGFja2VkIiwic2VyaWVzLXNwbGluZS1zdGFja2VkIiwic2VyaWVzLWNvbHVtbi1zdGFja2VkIiwic2VyaWVzLWJhci1zdGFja2VkIiwic2VyaWVzLWFyZWFzcGxpbmUtc3RhY2tlZCIsInNlcmllcy1jb21iby1zdGFja2VkIiwic2VyaWVzLWNvbWJvc3BsaW5lLXN0YWNrZWQiXX0sImNoYXJ0cy1sZWdlbmQiOntyZXF1aXJlczpbImNoYXJ0cy1iYXNlIl19LGNsYXNzbmFtZW1hbmFnZXI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImNsaWNrYWJsZS1yYWlsIjp7cmVxdWlyZXM6WyJzbGlkZXItYmFzZSJdfSxjb2xsZWN0aW9uOnt1c2U6WyJhcnJheS1leHRyYXMiLCJhcnJheWxpc3QiLCJhcnJheWxpc3QtYWRkIiwiYXJyYXlsaXN0LWZpbHRlciIsImFycmF5LWludm9rZSJdfSxjb2xvcjp7dXNlOlsiY29sb3ItYmFzZSIsImNvbG9yLWhzbCIsImNvbG9yLWhhcm1vbnkiXX0sImNvbG9yLWJhc2UiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJjb2xvci1oYXJtb255Ijp7cmVxdWlyZXM6WyJjb2xvci1oc2wiXX0sImNvbG9yLWhzbCI6e3JlcXVpcmVzOlsiY29sb3ItYmFzZSJdfSwiY29sb3ItaHN2Ijp7cmVxdWlyZXM6WyJjb2xvci1iYXNlIl19LGNvbnNvbGU6e2xhbmc6WyJlbiIsImVzIiwiaHUiLCJpdCIsImphIl0scmVxdWlyZXM6WyJ5dWktbG9nIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwiY29uc29sZS1maWx0ZXJzIjp7cmVxdWlyZXM6WyJwbHVnaW4iLCJjb25zb2xlIl0sc2tpbm5hYmxlOiEwfSwiY29udGVudC1lZGl0YWJsZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZWRpdG9yLXNlbGVjdGlvbiIsInN0eWxlc2hlZXQiLCJwbHVnaW4iXX0sY29udHJvbGxlcjp7dXNlOlsicm91dGVyIl19LGNvb2tpZTp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwiY3JlYXRlbGluay1iYXNlIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSJdfSxjc3NiYXNlOnthZnRlcjpbImNzc3Jlc2V0IiwiY3NzZm9udHMiLCJjc3NncmlkcyIsImNzc3Jlc2V0LWNvbnRleHQiLCJjc3Nmb250cy1jb250ZXh0IiwiY3NzZ3JpZHMtY29udGV4dCJdLHR5cGU6ImNzcyJ9LCJjc3NiYXNlLWNvbnRleHQiOnthZnRlcjpbImNzc3Jlc2V0IgosImNzc2ZvbnRzIiwiY3NzZ3JpZHMiLCJjc3NyZXNldC1jb250ZXh0IiwiY3NzZm9udHMtY29udGV4dCIsImNzc2dyaWRzLWNvbnRleHQiXSx0eXBlOiJjc3MifSxjc3NidXR0b246e3R5cGU6ImNzcyJ9LGNzc2ZvbnRzOnt0eXBlOiJjc3MifSwiY3NzZm9udHMtY29udGV4dCI6e3R5cGU6ImNzcyJ9LGNzc2dyaWRzOntvcHRpb25hbDpbImNzc25vcm1hbGl6ZSJdLHR5cGU6ImNzcyJ9LCJjc3Nncmlkcy1iYXNlIjp7b3B0aW9uYWw6WyJjc3Nub3JtYWxpemUiXSx0eXBlOiJjc3MifSwiY3NzZ3JpZHMtcmVzcG9uc2l2ZSI6e29wdGlvbmFsOlsiY3Nzbm9ybWFsaXplIl0scmVxdWlyZXM6WyJjc3NncmlkcyIsImNzc2dyaWRzLXJlc3BvbnNpdmUtYmFzZSJdLHR5cGU6ImNzcyJ9LCJjc3Nncmlkcy11bml0cyI6e29wdGlvbmFsOlsiY3Nzbm9ybWFsaXplIl0scmVxdWlyZXM6WyJjc3Nncmlkcy1iYXNlIl0sdHlwZToiY3NzIn0sY3Nzbm9ybWFsaXplOnt0eXBlOiJjc3MifSwiY3Nzbm9ybWFsaXplLWNvbnRleHQiOnt0eXBlOiJjc3MifSxjc3NyZXNldDp7dHlwZToiY3NzIn0sImNzc3Jlc2V0LWNvbnRleHQiOnt0eXBlOiJjc3MifSxkYXRhc2NoZW1hOnt1c2U6WyJkYXRhc2NoZW1hLWJhc2UiLCJkYXRhc2NoZW1hLWpzb24iLCJkYXRhc2NoZW1hLXhtbCIsImRhdGFzY2hlbWEtYXJyYXkiLCJkYXRhc2NoZW1hLXRleHQiXX0sImRhdGFzY2hlbWEtYXJyYXkiOntyZXF1aXJlczpbImRhdGFzY2hlbWEtYmFzZSJdfSwiZGF0YXNjaGVtYS1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIl19LCJkYXRhc2NoZW1hLWpzb24iOntyZXF1aXJlczpbImRhdGFzY2hlbWEtYmFzZSIsImpzb24iXX0sImRhdGFzY2hlbWEtdGV4dCI6e3JlcXVpcmVzOlsiZGF0YXNjaGVtYS1iYXNlIl19LCJkYXRhc2NoZW1hLXhtbCI6e3JlcXVpcmVzOlsiZGF0YXNjaGVtYS1iYXNlIl19LGRhdGFzb3VyY2U6e3VzZTpbImRhdGFzb3VyY2UtbG9jYWwiLCJkYXRhc291cmNlLWlvIiwiZGF0YXNvdXJjZS1nZXQiLCJkYXRhc291cmNlLWZ1bmN0aW9uIiwiZGF0YXNvdXJjZS1jYWNoZSIsImRhdGFzb3VyY2UtanNvbnNjaGVtYSIsImRhdGFzb3VyY2UteG1sc2NoZW1hIiwiZGF0YXNvdXJjZS1hcnJheXNjaGVtYSIsImRhdGFzb3VyY2UtdGV4dHNjaGVtYSIsImRhdGFzb3VyY2UtcG9sbGluZyJdfSwiZGF0YXNvdXJjZS1hcnJheXNjaGVtYSI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsInBsdWdpbiIsImRhdGFzY2hlbWEtYXJyYXkiXX0sImRhdGFzb3VyY2UtY2FjaGUiOntyZXF1aXJlczpbImRhdGFzb3VyY2UtbG9jYWwiLCJwbHVnaW4iLCJjYWNoZS1iYXNlIl19LCJkYXRhc291cmNlLWZ1bmN0aW9uIjp7cmVxdWlyZXM6WyJkYXRhc291cmNlLWxvY2FsIl19LCJkYXRhc291cmNlLWdldCI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsImdldCJdfSwiZGF0YXNvdXJjZS1pbyI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsImlvLWJhc2UiXX0sImRhdGFzb3VyY2UtanNvbnNjaGVtYSI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsInBsdWdpbiIsImRhdGFzY2hlbWEtanNvbiJdfSwiZGF0YXNvdXJjZS1sb2NhbCI6e3JlcXVpcmVzOlsiYmFzZSJdfSwiZGF0YXNvdXJjZS1wb2xsaW5nIjp7cmVxdWlyZXM6WyJkYXRhc291cmNlLWxvY2FsIl19LCJkYXRhc291cmNlLXRleHRzY2hlbWEiOntyZXF1aXJlczpbImRhdGFzb3VyY2UtbG9jYWwiLCJwbHVnaW4iLCJkYXRhc2NoZW1hLXRleHQiXX0sImRhdGFzb3VyY2UteG1sc2NoZW1hIjp7cmVxdWlyZXM6WyJkYXRhc291cmNlLWxvY2FsIiwicGx1Z2luIiwiZGF0YXR5cGUteG1sIiwiZGF0YXNjaGVtYS14bWwiXX0sZGF0YXRhYmxlOnt1c2U6WyJkYXRhdGFibGUtY29yZSIsImRhdGF0YWJsZS10YWJsZSIsImRhdGF0YWJsZS1oZWFkIiwiZGF0YXRhYmxlLWJvZHkiLCJkYXRhdGFibGUtYmFzZSIsImRhdGF0YWJsZS1jb2x1bW4td2lkdGhzIiwiZGF0YXRhYmxlLW1lc3NhZ2UiLCJkYXRhdGFibGUtbXV0YWJsZSIsImRhdGF0YWJsZS1zb3J0IiwiZGF0YXRhYmxlLWRhdGFzb3VyY2UiXX0sImRhdGF0YWJsZS1iYXNlIjp7cmVxdWlyZXM6WyJkYXRhdGFibGUtY29yZSIsImRhdGF0YWJsZS10YWJsZSIsImRhdGF0YWJsZS1oZWFkIiwiZGF0YXRhYmxlLWJvZHkiLCJiYXNlLWJ1aWxkIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwiZGF0YXRhYmxlLWJvZHkiOntyZXF1aXJlczpbImRhdGF0YWJsZS1jb3JlIiwidmlldyIsImNsYXNzbmFtZW1hbmFnZXIiXX0sImRhdGF0YWJsZS1jb2x1bW4td2lkdGhzIjp7cmVxdWlyZXM6WyJkYXRhdGFibGUtYmFzZSJdfSwiZGF0YXRhYmxlLWNvcmUiOntyZXF1aXJlczpbImVzY2FwZSIsIm1vZGVsLWxpc3QiLCJub2RlLWV2ZW50LWRlbGVnYXRlIl19LCJkYXRhdGFibGUtZGF0YXNvdXJjZSI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiLCJwbHVnaW4iLCJkYXRhc291cmNlLWxvY2FsIl19LCJkYXRhdGFibGUtZm9vdCI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWNvcmUiLCJ2aWV3Il19LCJkYXRhdGFibGUtZm9ybWF0dGVycyI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJvZHkiLCJkYXRhdHlwZS1udW1iZXItZm9ybWF0IiwiZGF0YXR5cGUtZGF0ZS1mb3JtYXQiLCJlc2NhcGUiXX0sImRhdGF0YWJsZS1oZWFkIjp7cmVxdWlyZXM6WyJkYXRhdGFibGUtY29yZSIsInZpZXciLCJjbGFzc25hbWVtYW5hZ2VyIl19LCJkYXRhdGFibGUtaGlnaGxpZ2h0Ijp7cmVxdWlyZXM6WyJkYXRhdGFibGUtYmFzZSIsImV2ZW50LWhvdmVyIl0sc2tpbm5hYmxlOiEwfSwiZGF0YXRhYmxlLWtleW5hdiI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiXX0sImRhdGF0YWJsZS1tZXNzYWdlIjp7bGFuZzpbImVuIiwiZnIiLCJlcyIsImh1IiwiaXQiXSxyZXF1aXJlczpbImRhdGF0YWJsZS1iYXNlIl0sc2tpbm5hYmxlOiEwfSwiZGF0YXRhYmxlLW11dGFibGUiOntyZXF1aXJlczpbImRhdGF0YWJsZS1iYXNlIl19LCJkYXRhdGFibGUtcGFnaW5hdG9yIjp7bGFuZzpbImVuIiwiZnIiXSxyZXF1aXJlczpbIm1vZGVsIiwidmlldyIsInBhZ2luYXRvci1jb3JlIiwiZGF0YXRhYmxlLWZvb3QiLCJkYXRhdGFibGUtcGFnaW5hdG9yLXRlbXBsYXRlcyJdLHNraW5uYWJsZTohMH0sImRhdGF0YWJsZS1wYWdpbmF0b3ItdGVtcGxhdGVzIjp7cmVxdWlyZXM6WyJ0ZW1wbGF0ZSJdfSwiZGF0YXRhYmxlLXNjcm9sbCI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiLCJkYXRhdGFibGUtY29sdW1uLXdpZHRocyIsImRvbS1zY3JlZW4iXSxza2lubmFibGU6ITB9LCJkYXRhdGFibGUtc29ydCI6e2xhbmc6WyJlbiIsImZyIiwiZXMiLCJodSJdLHJlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiXSxza2lubmFibGU6ITB9LCJkYXRhdGFibGUtdGFibGUiOntyZXF1aXJlczpbImRhdGF0YWJsZS1jb3JlIiwiZGF0YXRhYmxlLWhlYWQiLCJkYXRhdGFibGUtYm9keSIsInZpZXciLCJjbGFzc25hbWVtYW5hZ2VyIl19LGRhdGF0eXBlOnt1c2U6WyJkYXRhdHlwZS1kYXRlIiwiZGF0YXR5cGUtbnVtYmVyIiwiZGF0YXR5cGUteG1sIl19LCJkYXRhdHlwZS1kYXRlIjp7dXNlOlsiZGF0YXR5cGUtZGF0ZS1wYXJzZSIsImRhdGF0eXBlLWRhdGUtZm9ybWF0IiwiZGF0YXR5cGUtZGF0ZS1tYXRoIl19LCJkYXRhdHlwZS1kYXRlLWZvcm1hdCI6e2xhbmc6WyJhciIsImFyLUpPIiwiY2EiLCJjYS1FUyIsImRhIiwiZGEtREsiLCJkZSIsImRlLUFUIiwiZGUtREUiLCJlbCIsImVsLUdSIiwiZW4iLCJlbi1BVSIsImVuLUNBIiwiZW4tR0IiLCJlbi1JRSIsImVuLUlOIiwiZW4tSk8iLCJlbi1NWSIsImVuLU5aIiwiZW4tUEgiLCJlbi1TRyIsImVuLVVTIiwiZXMiLCJlcy1BUiIsImVzLUJPIiwiZXMtQ0wiLCJlcy1DTyIsImVzLUVDIiwiZXMtRVMiLCJlcy1NWCIsImVzLVBFIiwiZXMtUFkiLCJlcy1VUyIsImVzLVVZIiwiZXMtVkUiLCJmaSIsImZpLUZJIiwiZnIiLCJmci1CRSIsImZyLUNBIiwiZnItRlIiLCJoaSIsImhpLUlOIiwiaHUiLCJpZCIsImlkLUlEIiwiaXQiLCJpdC1JVCIsImphIiwiamEtSlAiLCJrbyIsImtvLUtSIiwibXMiLCJtcy1NWSIsIm5iIiwibmItTk8iLCJubCIsIm5sLUJFIiwibmwtTkwiLCJwbCIsInBsLVBMIiwicHQiLCJwdC1CUiIsInJvIiwicm8tUk8iLCJydSIsInJ1LVJVIiwic3YiLCJzdi1TRSIsInRoIiwidGgtVEgiLCJ0ciIsInRyLVRSIiwidmkiLCJ2aS1WTiIsInpoLUhhbnMiLCJ6aC1IYW5zLUNOIiwiemgtSGFudCIsInpoLUhhbnQtSEsiLCJ6aC1IYW50LVRXIl19LCJkYXRhdHlwZS1kYXRlLW1hdGgiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJkYXRhdHlwZS1kYXRlLXBhcnNlIjp7fSwiZGF0YXR5cGUtbnVtYmVyIjp7dXNlOlsiZGF0YXR5cGUtbnVtYmVyLXBhcnNlIiwiZGF0YXR5cGUtbnVtYmVyLWZvcm1hdCJdfSwiZGF0YXR5cGUtbnVtYmVyLWZvcm1hdCI6e30sImRhdGF0eXBlLW51bWJlci1wYXJzZSI6e3JlcXVpcmVzOlsiZXNjYXBlIl19LCJkYXRhdHlwZS14bWwiOnt1c2U6WyJkYXRhdHlwZS14bWwtcGFyc2UiLCJkYXRhdHlwZS14bWwtZm9ybWF0Il19LCJkYXRhdHlwZS14bWwtZm9ybWF0Ijp7fSwiZGF0YXR5cGUteG1sLXBhcnNlIjp7fSxkZDp7dXNlOlsiZGQtZGRtLWJhc2UiLCJkZC1kZG0iLCJkZC1kZG0tZHJvcCIsImRkLWRyYWciLCJkZC1wcm94eSIsImRkLWNvbnN0cmFpbiIsImRkLWRyb3AiLCJkZC1zY3JvbGwiLCJkZC1kZWxlZ2F0ZSJdfSwiZGQtY29uc3RyYWluIjp7cmVxdWlyZXM6WyJkZC1kcmFnIl19LCJkZC1kZG0iOntyZXF1aXJlczpbImRkLWRkbS1iYXNlIiwiZXZlbnQtcmVzaXplIl19LCJkZC1kZG0tYmFzZSI6e3JlcXVpcmVzOlsibm9kZSIsImJhc2UiLCJ5dWktdGhyb3R0bGUiLCJjbGFzc25hbWVtYW5hZ2VyIl19LCJkZC1kZG0tZHJvcCI6e3JlcXVpcmVzOlsiZGQtZGRtIl19LCJkZC1kZWxlZ2F0ZSI6e3JlcXVpcmVzOlsiZGQtZHJhZyIsImRkLWRyb3AtcGx1Z2luIiwiZXZlbnQtbW91c2VlbnRlciJdfSwiZGQtZHJhZyI6e3JlcXVpcmVzOlsiZGQtZGRtLWJhc2UiXX0sImRkLWRyb3AiOntyZXF1aXJlczpbImRkLWRyYWciLCJkZC1kZG0tZHJvcCJdfSwiZGQtZHJvcC1wbHVnaW4iOntyZXF1aXJlczpbImRkLWRyb3AiXX0sImRkLWdlc3R1cmVzIjp7Y29uZGl0aW9uOntuYW1lOiJkZC1nZXN0dXJlcyIsdHJpZ2dlcjoiZGQtZHJhZyIsdWE6InRvdWNoRW5hYmxlZCJ9LHJlcXVpcmVzOlsiZGQtZHJhZyIsImV2ZW50LXN5bnRoZXRpYyIsImV2ZW50LWdlc3R1cmVzIl19LCJkZC1wbHVnaW4iOntvcHRpb25hbDpbImRkLWNvbnN0cmFpbiIsImRkLXByb3h5Il0scmVxdWlyZXM6WyJkZC1kcmFnIl19LCJkZC1wcm94eSI6e3JlcXVpcmVzOlsiZGQtZHJhZyJdfSwiZGQtc2Nyb2xsIjp7cmVxdWlyZXM6WyJkZC1kcmFnIl19LGRpYWw6e2xhbmc6WyJlbiIsImVzIiwiaHUiXSxyZXF1aXJlczpbIndpZGdldCIsImRkLWRyYWciLCJldmVudC1tb3VzZWVudGVyIiwiZXZlbnQtbW92ZSIsImV2ZW50LWtleSIsInRyYW5zaXRpb24iLCJpbnRsIl0sc2tpbm5hYmxlOiEwfSxkb206e3VzZTpbImRvbS1iYXNlIiwiZG9tLXNjcmVlbiIsImRvbS1zdHlsZSIsInNlbGVjdG9yLW5hdGl2ZSIsInNlbGVjdG9yIl19LCJkb20tYmFzZSI6e3JlcXVpcmVzOlsiZG9tLWNvcmUiXX0sImRvbS1jb3JlIjp7cmVxdWlyZXM6WyJvb3AiLCJmZWF0dXJlcyJdfSwiZG9tLXNjcmVlbiI6e3JlcXVpcmVzOlsiZG9tLWJhc2UiLCJkb20tc3R5bGUiXX0sImRvbS1zdHlsZSI6e3JlcXVpcmVzOlsiZG9tLWJhc2UiXX0sImRvbS1zdHlsZS1pZSI6e2NvbmRpdGlvbjp7bmFtZToiZG9tLXN0eWxlLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuRmVhdHVyZXMudGVzdCxuPWUuRmVhdHVyZXMuYWRkLHI9ZS5jb25maWcud2luLGk9ZS5jb25maWcuZG9jLHM9ImRvY3VtZW50RWxlbWVudCIsbz0hMTtyZXR1cm4gbigic3R5bGUiLCJjb21wdXRlZFN0eWxlIix7dGVzdDpmdW5jdGlvbigpe3JldHVybiByJiYiZ2V0Q29tcHV0ZWRTdHlsZSJpbiByfX0pCixuKCJzdHlsZSIsIm9wYWNpdHkiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIGkmJiJvcGFjaXR5ImluIGlbc10uc3R5bGV9fSksbz0hdCgic3R5bGUiLCJvcGFjaXR5IikmJiF0KCJzdHlsZSIsImNvbXB1dGVkU3R5bGUiKSxvfSx0cmlnZ2VyOiJkb20tc3R5bGUifSxyZXF1aXJlczpbImRvbS1zdHlsZSIsImNvbG9yLWJhc2UiXX0sZHVtcDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxlZGl0b3I6e3VzZTpbImZyYW1lIiwiZWRpdG9yLXNlbGVjdGlvbiIsImV4ZWMtY29tbWFuZCIsImVkaXRvci1iYXNlIiwiZWRpdG9yLXBhcmEiLCJlZGl0b3ItYnIiLCJlZGl0b3ItYmlkaSIsImVkaXRvci10YWIiLCJjcmVhdGVsaW5rLWJhc2UiXX0sImVkaXRvci1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIiwiZnJhbWUiLCJub2RlIiwiZXhlYy1jb21tYW5kIiwiZWRpdG9yLXNlbGVjdGlvbiJdfSwiZWRpdG9yLWJpZGkiOntyZXF1aXJlczpbImVkaXRvci1iYXNlIl19LCJlZGl0b3ItYnIiOntyZXF1aXJlczpbImVkaXRvci1iYXNlIl19LCJlZGl0b3ItaW5saW5lIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSIsImNvbnRlbnQtZWRpdGFibGUiXX0sImVkaXRvci1saXN0cyI6e3JlcXVpcmVzOlsiZWRpdG9yLWJhc2UiXX0sImVkaXRvci1wYXJhIjp7cmVxdWlyZXM6WyJlZGl0b3ItcGFyYS1iYXNlIl19LCJlZGl0b3ItcGFyYS1iYXNlIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSJdfSwiZWRpdG9yLXBhcmEtaWUiOntjb25kaXRpb246e25hbWU6ImVkaXRvci1wYXJhLWllIix0cmlnZ2VyOiJlZGl0b3ItcGFyYSIsdWE6ImllIix3aGVuOiJpbnN0ZWFkIn0scmVxdWlyZXM6WyJlZGl0b3ItcGFyYS1iYXNlIl19LCJlZGl0b3Itc2VsZWN0aW9uIjp7cmVxdWlyZXM6WyJub2RlIl19LCJlZGl0b3ItdGFiIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSJdfSxlc2NhcGU6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sZXZlbnQ6e2FmdGVyOlsibm9kZS1iYXNlIl0sdXNlOlsiZXZlbnQtYmFzZSIsImV2ZW50LWRlbGVnYXRlIiwiZXZlbnQtc3ludGhldGljIiwiZXZlbnQtbW91c2V3aGVlbCIsImV2ZW50LW1vdXNlZW50ZXIiLCJldmVudC1rZXkiLCJldmVudC1mb2N1cyIsImV2ZW50LXJlc2l6ZSIsImV2ZW50LWhvdmVyIiwiZXZlbnQtb3V0c2lkZSIsImV2ZW50LXRvdWNoIiwiZXZlbnQtbW92ZSIsImV2ZW50LWZsaWNrIiwiZXZlbnQtdmFsdWVjaGFuZ2UiLCJldmVudC10YXAiXX0sImV2ZW50LWJhc2UiOnthZnRlcjpbIm5vZGUtYmFzZSJdLHJlcXVpcmVzOlsiZXZlbnQtY3VzdG9tLWJhc2UiXX0sImV2ZW50LWJhc2UtaWUiOnthZnRlcjpbImV2ZW50LWJhc2UiXSxjb25kaXRpb246e25hbWU6ImV2ZW50LWJhc2UtaWUiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jJiZlLmNvbmZpZy5kb2MuaW1wbGVtZW50YXRpb247cmV0dXJuIHQmJiF0Lmhhc0ZlYXR1cmUoIkV2ZW50cyIsIjIuMCIpfSx0cmlnZ2VyOiJub2RlLWJhc2UifSxyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtY29udGV4dG1lbnUiOntyZXF1aXJlczpbImV2ZW50LXN5bnRoZXRpYyIsImRvbS1zY3JlZW4iXX0sImV2ZW50LWN1c3RvbSI6e3VzZTpbImV2ZW50LWN1c3RvbS1iYXNlIiwiZXZlbnQtY3VzdG9tLWNvbXBsZXgiXX0sImV2ZW50LWN1c3RvbS1iYXNlIjp7cmVxdWlyZXM6WyJvb3AiXX0sImV2ZW50LWN1c3RvbS1jb21wbGV4Ijp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSJdfSwiZXZlbnQtZGVsZWdhdGUiOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtZmxpY2siOntyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LXRvdWNoIiwiZXZlbnQtc3ludGhldGljIl19LCJldmVudC1mb2N1cyI6e3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19LCJldmVudC1nZXN0dXJlcyI6e3VzZTpbImV2ZW50LWZsaWNrIiwiZXZlbnQtbW92ZSJdfSwiZXZlbnQtaG92ZXIiOntyZXF1aXJlczpbImV2ZW50LW1vdXNlZW50ZXIiXX0sImV2ZW50LWtleSI6e3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19LCJldmVudC1tb3VzZWVudGVyIjp7cmVxdWlyZXM6WyJldmVudC1zeW50aGV0aWMiXX0sImV2ZW50LW1vdXNld2hlZWwiOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtbW92ZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZXZlbnQtdG91Y2giLCJldmVudC1zeW50aGV0aWMiXX0sImV2ZW50LW91dHNpZGUiOntyZXF1aXJlczpbImV2ZW50LXN5bnRoZXRpYyJdfSwiZXZlbnQtcmVzaXplIjp7cmVxdWlyZXM6WyJub2RlLWJhc2UiLCJldmVudC1zeW50aGV0aWMiXX0sImV2ZW50LXNpbXVsYXRlIjp7cmVxdWlyZXM6WyJldmVudC1iYXNlIl19LCJldmVudC1zeW50aGV0aWMiOntyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWN1c3RvbS1jb21wbGV4Il19LCJldmVudC10YXAiOntyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWJhc2UiLCJldmVudC10b3VjaCIsImV2ZW50LXN5bnRoZXRpYyJdfSwiZXZlbnQtdG91Y2giOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtdmFsdWVjaGFuZ2UiOntyZXF1aXJlczpbImV2ZW50LWZvY3VzIiwiZXZlbnQtc3ludGhldGljIl19LCJleGVjLWNvbW1hbmQiOntyZXF1aXJlczpbImZyYW1lIl19LGZlYXR1cmVzOntyZXF1aXJlczpbInl1aS1iYXNlIl19LGZpbGU6e3JlcXVpcmVzOlsiZmlsZS1mbGFzaCIsImZpbGUtaHRtbDUiXX0sImZpbGUtZmxhc2giOntyZXF1aXJlczpbImJhc2UiXX0sImZpbGUtaHRtbDUiOntyZXF1aXJlczpbImJhc2UiXX0sZnJhbWU6e3JlcXVpcmVzOlsiYmFzZSIsIm5vZGUiLCJwbHVnaW4iLCJzZWxlY3Rvci1jc3MzIiwieXVpLXRocm90dGxlIl19LCJnZXN0dXJlLXNpbXVsYXRlIjp7cmVxdWlyZXM6WyJhc3luYy1xdWV1ZSIsImV2ZW50LXNpbXVsYXRlIiwibm9kZS1zY3JlZW4iXX0sZ2V0OntyZXF1aXJlczpbInl1aS1iYXNlIl19LGdyYXBoaWNzOntyZXF1aXJlczpbIm5vZGUiLCJldmVudC1jdXN0b20iLCJwbHVnaW5ob3N0IiwibWF0cml4IiwiY2xhc3NuYW1lbWFuYWdlciJdfSwiZ3JhcGhpY3MtY2FudmFzIjp7Y29uZGl0aW9uOntuYW1lOiJncmFwaGljcy1jYW52YXMiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49ZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmUmJmUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lPT0iY2FudmFzIixyPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT10JiZ0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKTtyZXR1cm4oIWl8fG4pJiZyJiZyLmdldENvbnRleHQmJnIuZ2V0Q29udGV4dCgiMmQiKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSxyZXF1aXJlczpbImdyYXBoaWNzIiwiY29sb3ItYmFzZSJdfSwiZ3JhcGhpY3MtY2FudmFzLWRlZmF1bHQiOntjb25kaXRpb246e25hbWU6ImdyYXBoaWNzLWNhbnZhcy1kZWZhdWx0Iix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lJiZlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZT09ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuKCFpfHxuKSYmciYmci5nZXRDb250ZXh0JiZyLmdldENvbnRleHQoIjJkIil9LHRyaWdnZXI6ImdyYXBoaWNzIn19LCJncmFwaGljcy1ncm91cCI6e3JlcXVpcmVzOlsiZ3JhcGhpY3MiXX0sImdyYXBoaWNzLXN2ZyI6e2NvbmRpdGlvbjp7bmFtZToiZ3JhcGhpY3Mtc3ZnIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPSFlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZXx8ZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmUhPSJjYW52YXMiLHI9dCYmdC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxpPXQmJnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNCYXNpY1N0cnVjdHVyZSIsIjEuMSIpO3JldHVybiBpJiYobnx8IXIpfSx0cmlnZ2VyOiJncmFwaGljcyJ9LHJlcXVpcmVzOlsiZ3JhcGhpY3MiXX0sImdyYXBoaWNzLXN2Zy1kZWZhdWx0Ijp7Y29uZGl0aW9uOntuYW1lOiJncmFwaGljcy1zdmctZGVmYXVsdCIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj0hZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmV8fGUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lIT0iY2FudmFzIixyPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT10JiZ0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKTtyZXR1cm4gaSYmKG58fCFyKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifX0sImdyYXBoaWNzLXZtbCI6e2NvbmRpdGlvbjp7bmFtZToiZ3JhcGhpY3Mtdm1sIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJuIHQmJiF0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKSYmKCFufHwhbi5nZXRDb250ZXh0fHwhbi5nZXRDb250ZXh0KCIyZCIpKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSxyZXF1aXJlczpbImdyYXBoaWNzIiwiY29sb3ItYmFzZSJdfSwiZ3JhcGhpY3Mtdm1sLWRlZmF1bHQiOntjb25kaXRpb246e25hbWU6ImdyYXBoaWNzLXZtbC1kZWZhdWx0Iix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJuIHQmJiF0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKSYmKCFufHwhbi5nZXRDb250ZXh0fHwhbi5nZXRDb250ZXh0KCIyZCIpKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifX0saGFuZGxlYmFyczp7dXNlOlsiaGFuZGxlYmFycy1jb21waWxlciJdfSwiaGFuZGxlYmFycy1iYXNlIjp7cmVxdWlyZXM6W119LCJoYW5kbGViYXJzLWNvbXBpbGVyIjp7cmVxdWlyZXM6WyJoYW5kbGViYXJzLWJhc2UiXX0saGlnaGxpZ2h0Ont1c2U6WyJoaWdobGlnaHQtYmFzZSIsImhpZ2hsaWdodC1hY2NlbnRmb2xkIl19LCJoaWdobGlnaHQtYWNjZW50Zm9sZCI6e3JlcXVpcmVzOlsiaGlnaGxpZ2h0LWJhc2UiLCJ0ZXh0LWFjY2VudGZvbGQiXX0sImhpZ2hsaWdodC1iYXNlIjp7cmVxdWlyZXM6WyJhcnJheS1leHRyYXMiLCJjbGFzc25hbWVtYW5hZ2VyIiwiZXNjYXBlIiwidGV4dC13b3JkYnJlYWsiXX0saGlzdG9yeTp7dXNlOlsiaGlzdG9yeS1iYXNlIiwiaGlzdG9yeS1oYXNoIiwiaGlzdG9yeS1odG1sNSJdfSwiaGlzdG9yeS1iYXNlIjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tY29tcGxleCJdfSwiaGlzdG9yeS1oYXNoIjp7YWZ0ZXI6WyJoaXN0b3J5LWh0bWw1Il0scmVxdWlyZXM6WyJldmVudC1zeW50aGV0aWMiLCJoaXN0b3J5LWJhc2UiLCJ5dWktbGF0ZXIiXX0sImhpc3RvcnktaGFzaC1pZSI6e2NvbmRpdGlvbjp7bmFtZToiaGlzdG9yeS1oYXNoLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmRvY3VtZW50TW9kZTtyZXR1cm4gZS5VQS5pZSYmKCEoIm9uaGFzaGNoYW5nZSJpbiBlLmNvbmZpZy53aW4pfHwhdHx8dDw4KX0sdHJpZ2dlcjoiaGlzdG9yeS1oYXNoIn0scmVxdWlyZXM6WyJoaXN0b3J5LWhhc2giLCJub2RlLWJhc2UiXX0sImhpc3RvcnktaHRtbDUiOntvcHRpb25hbDpbImpzb24iXSxyZXF1aXJlczpbImV2ZW50LWJhc2UiLCJoaXN0b3J5LWJhc2UiLCJub2RlLWJhc2UiCl19LGltYWdlbG9hZGVyOntyZXF1aXJlczpbImJhc2UtYmFzZSIsIm5vZGUtc3R5bGUiLCJub2RlLXNjcmVlbiJdfSxpbnRsOntyZXF1aXJlczpbImludGwtYmFzZSIsImV2ZW50LWN1c3RvbSJdfSwiaW50bC1iYXNlIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxpbzp7dXNlOlsiaW8tYmFzZSIsImlvLXhkciIsImlvLWZvcm0iLCJpby11cGxvYWQtaWZyYW1lIiwiaW8tcXVldWUiXX0sImlvLWJhc2UiOntyZXF1aXJlczpbImV2ZW50LWN1c3RvbS1iYXNlIiwicXVlcnlzdHJpbmctc3RyaW5naWZ5LXNpbXBsZSJdfSwiaW8tZm9ybSI6e3JlcXVpcmVzOlsiaW8tYmFzZSIsIm5vZGUtYmFzZSJdfSwiaW8tbm9kZWpzIjp7Y29uZGl0aW9uOntuYW1lOiJpby1ub2RlanMiLHRyaWdnZXI6ImlvLWJhc2UiLHVhOiJub2RlanMifSxyZXF1aXJlczpbImlvLWJhc2UiXX0sImlvLXF1ZXVlIjp7cmVxdWlyZXM6WyJpby1iYXNlIiwicXVldWUtcHJvbW90ZSJdfSwiaW8tdXBsb2FkLWlmcmFtZSI6e3JlcXVpcmVzOlsiaW8tYmFzZSIsIm5vZGUtYmFzZSJdfSwiaW8teGRyIjp7cmVxdWlyZXM6WyJpby1iYXNlIiwiZGF0YXR5cGUteG1sLXBhcnNlIl19LGpzb246e3VzZTpbImpzb24tcGFyc2UiLCJqc29uLXN0cmluZ2lmeSJdfSwianNvbi1wYXJzZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImpzb24tcGFyc2Utc2hpbSI6e2NvbmRpdGlvbjp7bmFtZToianNvbi1wYXJzZS1zaGltIix0ZXN0OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGkoZSx0KXtyZXR1cm4gZT09PSJvayI/ITA6dH12YXIgdD1lLmNvbmZpZy5nbG9iYWwuSlNPTixuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KT09PSJbb2JqZWN0IEpTT05dIiYmdCxyPWUuY29uZmlnLnVzZU5hdGl2ZUpTT05QYXJzZSE9PSExJiYhIW47aWYocil0cnl7cj1uLnBhcnNlKCd7Im9rIjpmYWxzZX0nLGkpLm9rfWNhdGNoKHMpe3I9ITF9cmV0dXJuIXJ9LHRyaWdnZXI6Impzb24tcGFyc2UifSxyZXF1aXJlczpbImpzb24tcGFyc2UiXX0sImpzb24tc3RyaW5naWZ5Ijp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwianNvbi1zdHJpbmdpZnktc2hpbSI6e2NvbmRpdGlvbjp7bmFtZToianNvbi1zdHJpbmdpZnktc2hpbSIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5nbG9iYWwuSlNPTixuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KT09PSJbb2JqZWN0IEpTT05dIiYmdCxyPWUuY29uZmlnLnVzZU5hdGl2ZUpTT05TdHJpbmdpZnkhPT0hMSYmISFuO2lmKHIpdHJ5e3I9IjAiPT09bi5zdHJpbmdpZnkoMCl9Y2F0Y2goaSl7cj0hMX1yZXR1cm4hcn0sdHJpZ2dlcjoianNvbi1zdHJpbmdpZnkifSxyZXF1aXJlczpbImpzb24tc3RyaW5naWZ5Il19LGpzb25wOntyZXF1aXJlczpbImdldCIsIm9vcCJdfSwianNvbnAtdXJsIjp7cmVxdWlyZXM6WyJqc29ucCJdfSwibGF6eS1tb2RlbC1saXN0Ijp7cmVxdWlyZXM6WyJtb2RlbC1saXN0Il19LGxvYWRlcjp7dXNlOlsibG9hZGVyLWJhc2UiLCJsb2FkZXItcm9sbHVwIiwibG9hZGVyLXl1aTMiXX0sImxvYWRlci1iYXNlIjp7cmVxdWlyZXM6WyJnZXQiLCJmZWF0dXJlcyJdfSwibG9hZGVyLXJvbGx1cCI6e3JlcXVpcmVzOlsibG9hZGVyLWJhc2UiXX0sImxvYWRlci15dWkzIjp7cmVxdWlyZXM6WyJsb2FkZXItYmFzZSJdfSxtYXRyaXg6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sbW9kZWw6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsImVzY2FwZSIsImpzb24tcGFyc2UiXX0sIm1vZGVsLWxpc3QiOntyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsImFycmF5LWludm9rZSIsImFycmF5bGlzdCIsImJhc2UtYnVpbGQiLCJlc2NhcGUiLCJqc29uLXBhcnNlIiwibW9kZWwiXX0sIm1vZGVsLXN5bmMtbG9jYWwiOntyZXF1aXJlczpbIm1vZGVsIiwianNvbi1zdHJpbmdpZnkiXX0sIm1vZGVsLXN5bmMtcmVzdCI6e3JlcXVpcmVzOlsibW9kZWwiLCJpby1iYXNlIiwianNvbi1zdHJpbmdpZnkiXX0sbm9kZTp7dXNlOlsibm9kZS1iYXNlIiwibm9kZS1ldmVudC1kZWxlZ2F0ZSIsIm5vZGUtcGx1Z2luaG9zdCIsIm5vZGUtc2NyZWVuIiwibm9kZS1zdHlsZSJdfSwibm9kZS1iYXNlIjp7cmVxdWlyZXM6WyJldmVudC1iYXNlIiwibm9kZS1jb3JlIiwiZG9tLWJhc2UiLCJkb20tc3R5bGUiXX0sIm5vZGUtY29yZSI6e3JlcXVpcmVzOlsiZG9tLWNvcmUiLCJzZWxlY3RvciJdfSwibm9kZS1ldmVudC1kZWxlZ2F0ZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZXZlbnQtZGVsZWdhdGUiXX0sIm5vZGUtZXZlbnQtaHRtbDUiOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwibm9kZS1ldmVudC1zaW11bGF0ZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZXZlbnQtc2ltdWxhdGUiLCJnZXN0dXJlLXNpbXVsYXRlIl19LCJub2RlLWZsaWNrIjp7cmVxdWlyZXM6WyJjbGFzc25hbWVtYW5hZ2VyIiwidHJhbnNpdGlvbiIsImV2ZW50LWZsaWNrIiwicGx1Z2luIl0sc2tpbm5hYmxlOiEwfSwibm9kZS1mb2N1c21hbmFnZXIiOntyZXF1aXJlczpbImF0dHJpYnV0ZSIsIm5vZGUiLCJwbHVnaW4iLCJub2RlLWV2ZW50LXNpbXVsYXRlIiwiZXZlbnQta2V5IiwiZXZlbnQtZm9jdXMiXX0sIm5vZGUtbG9hZCI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiaW8tYmFzZSJdfSwibm9kZS1tZW51bmF2Ijp7cmVxdWlyZXM6WyJub2RlIiwiY2xhc3NuYW1lbWFuYWdlciIsInBsdWdpbiIsIm5vZGUtZm9jdXNtYW5hZ2VyIl0sc2tpbm5hYmxlOiEwfSwibm9kZS1wbHVnaW5ob3N0Ijp7cmVxdWlyZXM6WyJub2RlLWJhc2UiLCJwbHVnaW5ob3N0Il19LCJub2RlLXNjcmVlbiI6e3JlcXVpcmVzOlsiZG9tLXNjcmVlbiIsIm5vZGUtYmFzZSJdfSwibm9kZS1zY3JvbGwtaW5mbyI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiYmFzZS1idWlsZCIsImV2ZW50LXJlc2l6ZSIsIm5vZGUtcGx1Z2luaG9zdCIsInBsdWdpbiIsInNlbGVjdG9yIl19LCJub2RlLXN0eWxlIjp7cmVxdWlyZXM6WyJkb20tc3R5bGUiLCJub2RlLWJhc2UiXX0sb29wOntyZXF1aXJlczpbInl1aS1iYXNlIl19LG92ZXJsYXk6e3JlcXVpcmVzOlsid2lkZ2V0Iiwid2lkZ2V0LXN0ZG1vZCIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1wb3NpdGlvbi1hbGlnbiIsIndpZGdldC1zdGFjayIsIndpZGdldC1wb3NpdGlvbi1jb25zdHJhaW4iXSxza2lubmFibGU6ITB9LHBhZ2luYXRvcjp7cmVxdWlyZXM6WyJwYWdpbmF0b3ItY29yZSJdfSwicGFnaW5hdG9yLWNvcmUiOntyZXF1aXJlczpbImJhc2UiXX0sInBhZ2luYXRvci11cmwiOntyZXF1aXJlczpbInBhZ2luYXRvciJdfSxwYW5lbDp7cmVxdWlyZXM6WyJ3aWRnZXQiLCJ3aWRnZXQtYXV0b2hpZGUiLCJ3aWRnZXQtYnV0dG9ucyIsIndpZGdldC1tb2RhbGl0eSIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1wb3NpdGlvbi1hbGlnbiIsIndpZGdldC1wb3NpdGlvbi1jb25zdHJhaW4iLCJ3aWRnZXQtc3RhY2siLCJ3aWRnZXQtc3RkbW9kIl0sc2tpbm5hYmxlOiEwfSxwYXJhbGxlbDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxwamF4OntyZXF1aXJlczpbInBqYXgtYmFzZSIsInBqYXgtY29udGVudCJdfSwicGpheC1iYXNlIjp7cmVxdWlyZXM6WyJjbGFzc25hbWVtYW5hZ2VyIiwibm9kZS1ldmVudC1kZWxlZ2F0ZSIsInJvdXRlciJdfSwicGpheC1jb250ZW50Ijp7cmVxdWlyZXM6WyJpby1iYXNlIiwibm9kZS1iYXNlIiwicm91dGVyIl19LCJwamF4LXBsdWdpbiI6e3JlcXVpcmVzOlsibm9kZS1wbHVnaW5ob3N0IiwicGpheCIsInBsdWdpbiJdfSxwbHVnaW46e3JlcXVpcmVzOlsiYmFzZS1iYXNlIl19LHBsdWdpbmhvc3Q6e3VzZTpbInBsdWdpbmhvc3QtYmFzZSIsInBsdWdpbmhvc3QtY29uZmlnIl19LCJwbHVnaW5ob3N0LWJhc2UiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJwbHVnaW5ob3N0LWNvbmZpZyI6e3JlcXVpcmVzOlsicGx1Z2luaG9zdC1iYXNlIl19LHByb21pc2U6e3JlcXVpcmVzOlsidGltZXJzIl19LHF1ZXJ5c3RyaW5nOnt1c2U6WyJxdWVyeXN0cmluZy1wYXJzZSIsInF1ZXJ5c3RyaW5nLXN0cmluZ2lmeSJdfSwicXVlcnlzdHJpbmctcGFyc2UiOntyZXF1aXJlczpbInl1aS1iYXNlIiwiYXJyYXktZXh0cmFzIl19LCJxdWVyeXN0cmluZy1wYXJzZS1zaW1wbGUiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJxdWVyeXN0cmluZy1zdHJpbmdpZnkiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJxdWVyeXN0cmluZy1zdHJpbmdpZnktc2ltcGxlIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwicXVldWUtcHJvbW90ZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sInJhbmdlLXNsaWRlciI6e3JlcXVpcmVzOlsic2xpZGVyLWJhc2UiLCJzbGlkZXItdmFsdWUtcmFuZ2UiLCJjbGlja2FibGUtcmFpbCJdfSxyZWNvcmRzZXQ6e3VzZTpbInJlY29yZHNldC1iYXNlIiwicmVjb3Jkc2V0LXNvcnQiLCJyZWNvcmRzZXQtZmlsdGVyIiwicmVjb3Jkc2V0LWluZGV4ZXIiXX0sInJlY29yZHNldC1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIiwiYXJyYXlsaXN0Il19LCJyZWNvcmRzZXQtZmlsdGVyIjp7cmVxdWlyZXM6WyJyZWNvcmRzZXQtYmFzZSIsImFycmF5LWV4dHJhcyIsInBsdWdpbiJdfSwicmVjb3Jkc2V0LWluZGV4ZXIiOntyZXF1aXJlczpbInJlY29yZHNldC1iYXNlIiwicGx1Z2luIl19LCJyZWNvcmRzZXQtc29ydCI6e3JlcXVpcmVzOlsiYXJyYXlzb3J0IiwicmVjb3Jkc2V0LWJhc2UiLCJwbHVnaW4iXX0scmVzaXplOnt1c2U6WyJyZXNpemUtYmFzZSIsInJlc2l6ZS1wcm94eSIsInJlc2l6ZS1jb25zdHJhaW4iXX0sInJlc2l6ZS1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIiwid2lkZ2V0IiwiZXZlbnQiLCJvb3AiLCJkZC1kcmFnIiwiZGQtZGVsZWdhdGUiLCJkZC1kcm9wIl0sc2tpbm5hYmxlOiEwfSwicmVzaXplLWNvbnN0cmFpbiI6e3JlcXVpcmVzOlsicGx1Z2luIiwicmVzaXplLWJhc2UiXX0sInJlc2l6ZS1wbHVnaW4iOntvcHRpb25hbDpbInJlc2l6ZS1jb25zdHJhaW4iXSxyZXF1aXJlczpbInJlc2l6ZS1iYXNlIiwicGx1Z2luIl19LCJyZXNpemUtcHJveHkiOntyZXF1aXJlczpbInBsdWdpbiIsInJlc2l6ZS1iYXNlIl19LHJvdXRlcjp7b3B0aW9uYWw6WyJxdWVyeXN0cmluZy1wYXJzZSJdLHJlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiYmFzZS1idWlsZCIsImhpc3RvcnkiXX0sc2Nyb2xsdmlldzp7cmVxdWlyZXM6WyJzY3JvbGx2aWV3LWJhc2UiLCJzY3JvbGx2aWV3LXNjcm9sbGJhcnMiXX0sInNjcm9sbHZpZXctYmFzZSI6e3JlcXVpcmVzOlsid2lkZ2V0IiwiZXZlbnQtZ2VzdHVyZXMiLCJldmVudC1tb3VzZXdoZWVsIiwidHJhbnNpdGlvbiJdLHNraW5uYWJsZTohMH0sInNjcm9sbHZpZXctYmFzZS1pZSI6e2NvbmRpdGlvbjp7bmFtZToic2Nyb2xsdmlldy1iYXNlLWllIix0cmlnZ2VyOiJzY3JvbGx2aWV3LWJhc2UiLHVhOiJpZSJ9LHJlcXVpcmVzOlsic2Nyb2xsdmlldy1iYXNlIl19LCJzY3JvbGx2aWV3LWxpc3QiOntyZXF1aXJlczpbInBsdWdpbiIsImNsYXNzbmFtZW1hbmFnZXIiXSxza2lubmFibGU6ITB9LCJzY3JvbGx2aWV3LXBhZ2luYXRvciI6e3JlcXVpcmVzOlsicGx1Z2luIiwiY2xhc3NuYW1lbWFuYWdlciJdfSwic2Nyb2xsdmlldy1zY3JvbGxiYXJzIjp7cmVxdWlyZXM6WyJjbGFzc25hbWVtYW5hZ2VyIiwidHJhbnNpdGlvbiIsInBsdWdpbiJdLHNraW5uYWJsZTohMH0sc2VsZWN0b3I6e3JlcXVpcmVzOlsic2VsZWN0b3ItbmF0aXZlIl19LCJzZWxlY3Rvci1jc3MyIjp7Y29uZGl0aW9uOntuYW1lOiJzZWxlY3Rvci1jc3MyIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJiEoInF1ZXJ5U2VsZWN0b3JBbGwiaW4gdCk7cmV0dXJuIG59LHRyaWdnZXI6InNlbGVjdG9yIn0scmVxdWlyZXM6WyJzZWxlY3Rvci1uYXRpdmUiXX0sInNlbGVjdG9yLWNzczMiOntyZXF1aXJlczpbInNlbGVjdG9yLW5hdGl2ZSIsInNlbGVjdG9yLWNzczIiXX0sInNlbGVjdG9yLW5hdGl2ZSI6e3JlcXVpcmVzOlsiZG9tLWJhc2UiXX0sInNlcmllcy1hcmVhIgo6e3JlcXVpcmVzOlsic2VyaWVzLWNhcnRlc2lhbiIsInNlcmllcy1maWxsLXV0aWwiXX0sInNlcmllcy1hcmVhLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLWFyZWEiXX0sInNlcmllcy1hcmVhc3BsaW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtYXJlYSIsInNlcmllcy1jdXJ2ZS11dGlsIl19LCJzZXJpZXMtYXJlYXNwbGluZS1zdGFja2VkIjp7cmVxdWlyZXM6WyJzZXJpZXMtc3RhY2tlZCIsInNlcmllcy1hcmVhc3BsaW5lIl19LCJzZXJpZXMtYmFyIjp7cmVxdWlyZXM6WyJzZXJpZXMtbWFya2VyIiwic2VyaWVzLWhpc3RvZ3JhbS1iYXNlIl19LCJzZXJpZXMtYmFyLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLWJhciJdfSwic2VyaWVzLWJhc2UiOntyZXF1aXJlczpbImdyYXBoaWNzIiwiYXhpcy1iYXNlIl19LCJzZXJpZXMtY2FuZGxlc3RpY2siOntyZXF1aXJlczpbInNlcmllcy1yYW5nZSJdfSwic2VyaWVzLWNhcnRlc2lhbiI6e3JlcXVpcmVzOlsic2VyaWVzLWJhc2UiXX0sInNlcmllcy1jb2x1bW4iOntyZXF1aXJlczpbInNlcmllcy1tYXJrZXIiLCJzZXJpZXMtaGlzdG9ncmFtLWJhc2UiXX0sInNlcmllcy1jb2x1bW4tc3RhY2tlZCI6e3JlcXVpcmVzOlsic2VyaWVzLXN0YWNrZWQiLCJzZXJpZXMtY29sdW1uIl19LCJzZXJpZXMtY29tYm8iOntyZXF1aXJlczpbInNlcmllcy1jYXJ0ZXNpYW4iLCJzZXJpZXMtbGluZS11dGlsIiwic2VyaWVzLXBsb3QtdXRpbCIsInNlcmllcy1maWxsLXV0aWwiXX0sInNlcmllcy1jb21iby1zdGFja2VkIjp7cmVxdWlyZXM6WyJzZXJpZXMtc3RhY2tlZCIsInNlcmllcy1jb21ibyJdfSwic2VyaWVzLWNvbWJvc3BsaW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtY29tYm8iLCJzZXJpZXMtY3VydmUtdXRpbCJdfSwic2VyaWVzLWNvbWJvc3BsaW5lLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1jb21iby1zdGFja2VkIiwic2VyaWVzLWN1cnZlLXV0aWwiXX0sInNlcmllcy1jdXJ2ZS11dGlsIjp7fSwic2VyaWVzLWZpbGwtdXRpbCI6e30sInNlcmllcy1oaXN0b2dyYW0tYmFzZSI6e3JlcXVpcmVzOlsic2VyaWVzLWNhcnRlc2lhbiIsInNlcmllcy1wbG90LXV0aWwiXX0sInNlcmllcy1saW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtY2FydGVzaWFuIiwic2VyaWVzLWxpbmUtdXRpbCJdfSwic2VyaWVzLWxpbmUtc3RhY2tlZCI6e3JlcXVpcmVzOlsic2VyaWVzLXN0YWNrZWQiLCJzZXJpZXMtbGluZSJdfSwic2VyaWVzLWxpbmUtdXRpbCI6e30sInNlcmllcy1tYXJrZXIiOntyZXF1aXJlczpbInNlcmllcy1jYXJ0ZXNpYW4iLCJzZXJpZXMtcGxvdC11dGlsIl19LCJzZXJpZXMtbWFya2VyLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLW1hcmtlciJdfSwic2VyaWVzLW9obGMiOntyZXF1aXJlczpbInNlcmllcy1yYW5nZSJdfSwic2VyaWVzLXBpZSI6e3JlcXVpcmVzOlsic2VyaWVzLWJhc2UiLCJzZXJpZXMtcGxvdC11dGlsIl19LCJzZXJpZXMtcGxvdC11dGlsIjp7fSwic2VyaWVzLXJhbmdlIjp7cmVxdWlyZXM6WyJzZXJpZXMtY2FydGVzaWFuIl19LCJzZXJpZXMtc3BsaW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtbGluZSIsInNlcmllcy1jdXJ2ZS11dGlsIl19LCJzZXJpZXMtc3BsaW5lLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLXNwbGluZSJdfSwic2VyaWVzLXN0YWNrZWQiOntyZXF1aXJlczpbImF4aXMtc3RhY2tlZCJdfSwic2hpbS1wbHVnaW4iOntyZXF1aXJlczpbIm5vZGUtc3R5bGUiLCJub2RlLXBsdWdpbmhvc3QiXX0sc2xpZGVyOnt1c2U6WyJzbGlkZXItYmFzZSIsInNsaWRlci12YWx1ZS1yYW5nZSIsImNsaWNrYWJsZS1yYWlsIiwicmFuZ2Utc2xpZGVyIl19LCJzbGlkZXItYmFzZSI6e3JlcXVpcmVzOlsid2lkZ2V0IiwiZGQtY29uc3RyYWluIiwiZXZlbnQta2V5Il0sc2tpbm5hYmxlOiEwfSwic2xpZGVyLXZhbHVlLXJhbmdlIjp7cmVxdWlyZXM6WyJzbGlkZXItYmFzZSJdfSxzb3J0YWJsZTp7cmVxdWlyZXM6WyJkZC1kZWxlZ2F0ZSIsImRkLWRyb3AtcGx1Z2luIiwiZGQtcHJveHkiXX0sInNvcnRhYmxlLXNjcm9sbCI6e3JlcXVpcmVzOlsiZGQtc2Nyb2xsIiwic29ydGFibGUiXX0sc3R5bGVzaGVldDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxzdWJzdGl0dXRlOntvcHRpb25hbDpbImR1bXAiXSxyZXF1aXJlczpbInl1aS1iYXNlIl19LHN3Zjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20iLCJub2RlIiwic3dmZGV0ZWN0IiwiZXNjYXBlIl19LHN3ZmRldGVjdDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSx0YWJ2aWV3OntyZXF1aXJlczpbIndpZGdldCIsIndpZGdldC1wYXJlbnQiLCJ3aWRnZXQtY2hpbGQiLCJ0YWJ2aWV3LWJhc2UiLCJub2RlLXBsdWdpbmhvc3QiLCJub2RlLWZvY3VzbWFuYWdlciJdLHNraW5uYWJsZTohMH0sInRhYnZpZXctYmFzZSI6e3JlcXVpcmVzOlsibm9kZS1ldmVudC1kZWxlZ2F0ZSIsImNsYXNzbmFtZW1hbmFnZXIiXX0sInRhYnZpZXctcGx1Z2luIjp7cmVxdWlyZXM6WyJ0YWJ2aWV3LWJhc2UiXX0sdGVtcGxhdGU6e3VzZTpbInRlbXBsYXRlLWJhc2UiLCJ0ZW1wbGF0ZS1taWNybyJdfSwidGVtcGxhdGUtYmFzZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sInRlbXBsYXRlLW1pY3JvIjp7cmVxdWlyZXM6WyJlc2NhcGUiXX0sdGVzdDp7cmVxdWlyZXM6WyJldmVudC1zaW11bGF0ZSIsImV2ZW50LWN1c3RvbSIsImpzb24tc3RyaW5naWZ5Il19LCJ0ZXN0LWNvbnNvbGUiOntyZXF1aXJlczpbImNvbnNvbGUtZmlsdGVycyIsInRlc3QiLCJhcnJheS1leHRyYXMiXSxza2lubmFibGU6ITB9LHRleHQ6e3VzZTpbInRleHQtYWNjZW50Zm9sZCIsInRleHQtd29yZGJyZWFrIl19LCJ0ZXh0LWFjY2VudGZvbGQiOntyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsInRleHQtZGF0YS1hY2NlbnRmb2xkIl19LCJ0ZXh0LWRhdGEtYWNjZW50Zm9sZCI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sInRleHQtZGF0YS13b3JkYnJlYWsiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJ0ZXh0LXdvcmRicmVhayI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwidGV4dC1kYXRhLXdvcmRicmVhayJdfSx0aW1lcnM6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sdHJhbnNpdGlvbjp7cmVxdWlyZXM6WyJub2RlLXN0eWxlIl19LCJ0cmFuc2l0aW9uLXRpbWVyIjp7Y29uZGl0aW9uOntuYW1lOiJ0cmFuc2l0aW9uLXRpbWVyIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQ/dC5kb2N1bWVudEVsZW1lbnQ6bnVsbCxyPSEwO3JldHVybiBuJiZuLnN0eWxlJiYocj0hKCJNb3pUcmFuc2l0aW9uImluIG4uc3R5bGV8fCJXZWJraXRUcmFuc2l0aW9uImluIG4uc3R5bGV8fCJ0cmFuc2l0aW9uImluIG4uc3R5bGUpKSxyfSx0cmlnZ2VyOiJ0cmFuc2l0aW9uIn0scmVxdWlyZXM6WyJ0cmFuc2l0aW9uIl19LHRyZWU6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsInRyZWUtbm9kZSJdfSwidHJlZS1sYWJlbGFibGUiOntyZXF1aXJlczpbInRyZWUiXX0sInRyZWUtbGF6eSI6e3JlcXVpcmVzOlsiYmFzZS1wbHVnaW5ob3N0IiwicGx1Z2luIiwidHJlZSJdfSwidHJlZS1ub2RlIjp7fSwidHJlZS1vcGVuYWJsZSI6e3JlcXVpcmVzOlsidHJlZSJdfSwidHJlZS1zZWxlY3RhYmxlIjp7cmVxdWlyZXM6WyJ0cmVlIl19LCJ0cmVlLXNvcnRhYmxlIjp7cmVxdWlyZXM6WyJ0cmVlIl19LHVwbG9hZGVyOntyZXF1aXJlczpbInVwbG9hZGVyLWh0bWw1IiwidXBsb2FkZXItZmxhc2giXX0sInVwbG9hZGVyLWZsYXNoIjp7cmVxdWlyZXM6WyJzd2ZkZXRlY3QiLCJlc2NhcGUiLCJ3aWRnZXQiLCJiYXNlIiwiY3NzYnV0dG9uIiwibm9kZSIsImV2ZW50LWN1c3RvbSIsInVwbG9hZGVyLXF1ZXVlIl19LCJ1cGxvYWRlci1odG1sNSI6e3JlcXVpcmVzOlsid2lkZ2V0Iiwibm9kZS1ldmVudC1zaW11bGF0ZSIsImZpbGUtaHRtbDUiLCJ1cGxvYWRlci1xdWV1ZSJdfSwidXBsb2FkZXItcXVldWUiOntyZXF1aXJlczpbImJhc2UiXX0sdmlldzp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwibm9kZS1ldmVudC1kZWxlZ2F0ZSJdfSwidmlldy1ub2RlLW1hcCI6e3JlcXVpcmVzOlsidmlldyJdfSx3aWRnZXQ6e3VzZTpbIndpZGdldC1iYXNlIiwid2lkZ2V0LWh0bWxwYXJzZXIiLCJ3aWRnZXQtc2tpbiIsIndpZGdldC11aWV2ZW50cyJdfSwid2lkZ2V0LWFuaW0iOntyZXF1aXJlczpbImFuaW0tYmFzZSIsInBsdWdpbiIsIndpZGdldCJdfSwid2lkZ2V0LWF1dG9oaWRlIjp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwiZXZlbnQta2V5IiwiZXZlbnQtb3V0c2lkZSIsIndpZGdldCJdfSwid2lkZ2V0LWJhc2UiOntyZXF1aXJlczpbImF0dHJpYnV0ZSIsImJhc2UtYmFzZSIsImJhc2UtcGx1Z2luaG9zdCIsImNsYXNzbmFtZW1hbmFnZXIiLCJldmVudC1mb2N1cyIsIm5vZGUtYmFzZSIsIm5vZGUtc3R5bGUiXSxza2lubmFibGU6ITB9LCJ3aWRnZXQtYmFzZS1pZSI6e2NvbmRpdGlvbjp7bmFtZToid2lkZ2V0LWJhc2UtaWUiLHRyaWdnZXI6IndpZGdldC1iYXNlIix1YToiaWUifSxyZXF1aXJlczpbIndpZGdldC1iYXNlIl19LCJ3aWRnZXQtYnV0dG9ucyI6e3JlcXVpcmVzOlsiYnV0dG9uLXBsdWdpbiIsImNzc2J1dHRvbiIsIndpZGdldC1zdGRtb2QiXX0sIndpZGdldC1jaGlsZCI6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsIndpZGdldCJdfSwid2lkZ2V0LWh0bWxwYXJzZXIiOntyZXF1aXJlczpbIndpZGdldC1iYXNlIl19LCJ3aWRnZXQtbW9kYWxpdHkiOntyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJldmVudC1vdXRzaWRlIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwid2lkZ2V0LXBhcmVudCI6e3JlcXVpcmVzOlsiYXJyYXlsaXN0IiwiYmFzZS1idWlsZCIsIndpZGdldCJdfSwid2lkZ2V0LXBvc2l0aW9uIjp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwibm9kZS1zY3JlZW4iLCJ3aWRnZXQiXX0sIndpZGdldC1wb3NpdGlvbi1hbGlnbiI6e3JlcXVpcmVzOlsid2lkZ2V0LXBvc2l0aW9uIl19LCJ3aWRnZXQtcG9zaXRpb24tY29uc3RyYWluIjp7cmVxdWlyZXM6WyJ3aWRnZXQtcG9zaXRpb24iXX0sIndpZGdldC1za2luIjp7cmVxdWlyZXM6WyJ3aWRnZXQtYmFzZSJdfSwid2lkZ2V0LXN0YWNrIjp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwid2lkZ2V0LXN0ZG1vZCI6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsIndpZGdldCJdfSwid2lkZ2V0LXVpZXZlbnRzIjp7cmVxdWlyZXM6WyJub2RlLWV2ZW50LWRlbGVnYXRlIiwid2lkZ2V0LWJhc2UiXX0seXFsOntyZXF1aXJlczpbIm9vcCJdfSwieXFsLWpzb25wIjp7Y29uZGl0aW9uOntuYW1lOiJ5cWwtanNvbnAiLHRlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIWUuVUEubm9kZWpzJiYhZS5VQS53aW5qc30sdHJpZ2dlcjoieXFsIn0scmVxdWlyZXM6WyJ5cWwiLCJqc29ucCIsImpzb25wLXVybCJdfSwieXFsLW5vZGVqcyI6e2NvbmRpdGlvbjp7bmFtZToieXFsLW5vZGVqcyIsdHJpZ2dlcjoieXFsIix1YToibm9kZWpzIn0scmVxdWlyZXM6WyJ5cWwiXX0sInlxbC13aW5qcyI6e2NvbmRpdGlvbjp7bmFtZToieXFsLXdpbmpzIix0cmlnZ2VyOiJ5cWwiLHVhOiJ3aW5qcyJ9LHJlcXVpcmVzOlsieXFsIl19LHl1aTp7fSwieXVpLWJhc2UiOnt9LCJ5dWktbGF0ZXIiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJ5dWktbG9nIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwieXVpLXRocm90dGxlIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfX0pLFlVSS5FbnZbZS52ZXJzaW9uXS5tZDU9IjQ1MzU3YmIxMWVkZGY3ZmQwYTg5YzBiNzU2NTk5ZGYyIn0sIjMuMTcuMiIse3JlcXVpcmVzOlsibG9hZGVyLWJhc2UiXX0pLFlVSS5hZGQoInl1aSIsZnVuY3Rpb24oZSx0KXt9LCIzLjE3LjIiLHt1c2U6WyJ5dWktYmFzZSIsImdldCIsImZlYXR1cmVzIiwiaW50bC1iYXNlIiwieXVpLWxvZyIsInl1aS1sYXRlciIsImxvYWRlci1iYXNlIiwibG9hZGVyLXJvbGx1cCIKLCJsb2FkZXIteXVpMyJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJvb3AiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gYSh0LG4saSxzLG8pe2lmKHQmJnRbb10mJnQhPT1lKXJldHVybiB0W29dLmNhbGwodCxuLGkpO3N3aXRjaChyLnRlc3QodCkpe2Nhc2UgMTpyZXR1cm4gcltvXSh0LG4saSk7Y2FzZSAyOnJldHVybiByW29dKGUuQXJyYXkodCwwLCEwKSxuLGkpO2RlZmF1bHQ6cmV0dXJuIGUuT2JqZWN0W29dKHQsbixpLHMpfX12YXIgbj1lLkxhbmcscj1lLkFycmF5LGk9T2JqZWN0LnByb3RvdHlwZSxzPSJffnl1aW1+XyIsbz1pLmhhc093blByb3BlcnR5LHU9aS50b1N0cmluZztlLmF1Z21lbnQ9ZnVuY3Rpb24odCxuLHIsaSxzKXt2YXIgYT10LnByb3RvdHlwZSxmPWEmJm4sbD1uLnByb3RvdHlwZSxjPWF8fHQsaCxwLGQsdixtO3JldHVybiBzPXM/ZS5BcnJheShzKTpbXSxmJiYocD17fSxkPXt9LHY9e30saD1mdW5jdGlvbihlLHQpe2lmKHJ8fCEodCBpbiBhKSl1LmNhbGwoZSk9PT0iW29iamVjdCBGdW5jdGlvbl0iPyh2W3RdPWUscFt0XT1kW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIG0odGhpcyxlLGFyZ3VtZW50cyl9KTpwW3RdPWV9LG09ZnVuY3Rpb24oZSx0LHIpe2Zvcih2YXIgaSBpbiB2KW8uY2FsbCh2LGkpJiZlW2ldPT09ZFtpXSYmKGVbaV09dltpXSk7cmV0dXJuIG4uYXBwbHkoZSxzKSx0LmFwcGx5KGUscil9LGk/ZS5BcnJheS5lYWNoKGksZnVuY3Rpb24oZSl7ZSBpbiBsJiZoKGxbZV0sZSl9KTplLk9iamVjdC5lYWNoKGwsaCxudWxsLCEwKSksZS5taXgoYyxwfHxsLHIsaSksZnx8bi5hcHBseShjLHMpLHR9LGUuYWdncmVnYXRlPWZ1bmN0aW9uKHQsbixyLGkpe3JldHVybiBlLm1peCh0LG4scixpLDAsITApfSxlLmV4dGVuZD1mdW5jdGlvbih0LG4scixzKXsoIW58fCF0KSYmZS5lcnJvcigiZXh0ZW5kIGZhaWxlZCwgdmVyaWZ5IGRlcGVuZGVuY2llcyIpO3ZhciBvPW4ucHJvdG90eXBlLHU9ZS5PYmplY3Qobyk7cmV0dXJuIHQucHJvdG90eXBlPXUsdS5jb25zdHJ1Y3Rvcj10LHQuc3VwZXJjbGFzcz1vLG4hPU9iamVjdCYmby5jb25zdHJ1Y3Rvcj09aS5jb25zdHJ1Y3RvciYmKG8uY29uc3RydWN0b3I9biksciYmZS5taXgodSxyLCEwKSxzJiZlLm1peCh0LHMsITApLHR9LGUuZWFjaD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gYShlLHQsbixyLCJlYWNoIil9LGUuc29tZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gYShlLHQsbixyLCJzb21lIil9LGUuY2xvbmU9ZnVuY3Rpb24odCxyLGksbyx1LGEpe3ZhciBmLGwsYztpZighbi5pc09iamVjdCh0KXx8ZS5pbnN0YW5jZU9mKHQsWVVJKXx8dC5hZGRFdmVudExpc3RlbmVyfHx0LmF0dGFjaEV2ZW50KXJldHVybiB0O2w9YXx8e307c3dpdGNoKG4udHlwZSh0KSl7Y2FzZSJkYXRlIjpyZXR1cm4gbmV3IERhdGUodCk7Y2FzZSJyZWdleHAiOnJldHVybiB0O2Nhc2UiZnVuY3Rpb24iOnJldHVybiB0O2Nhc2UiYXJyYXkiOmY9W107YnJlYWs7ZGVmYXVsdDppZih0W3NdKXJldHVybiBsW3Rbc11dO2M9ZS5ndWlkKCksZj1yP3t9OmUuT2JqZWN0KHQpLHRbc109YyxsW2NdPXR9cmV0dXJuIGUuZWFjaCh0LGZ1bmN0aW9uKG4sYSl7KGF8fGE9PT0wKSYmKCFpfHxpLmNhbGwob3x8dGhpcyxuLGEsdGhpcyx0KSE9PSExKSYmYSE9PXMmJmEhPSJwcm90b3R5cGUiJiYodGhpc1thXT1lLmNsb25lKG4scixpLG8sdXx8dCxsKSl9LGYpLGF8fChlLk9iamVjdC5lYWNoKGwsZnVuY3Rpb24oZSx0KXtpZihlW3NdKXRyeXtkZWxldGUgZVtzXX1jYXRjaChuKXtlW3NdPW51bGx9fSx0aGlzKSxsPW51bGwpLGZ9LGUuYmluZD1mdW5jdGlvbih0LHIpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+Mj9lLkFycmF5KGFyZ3VtZW50cywyLCEwKTpudWxsO3JldHVybiBmdW5jdGlvbigpe3ZhciBzPW4uaXNTdHJpbmcodCk/clt0XTp0LG89aT9pLmNvbmNhdChlLkFycmF5KGFyZ3VtZW50cywwLCEwKSk6YXJndW1lbnRzO3JldHVybiBzLmFwcGx5KHJ8fHMsbyl9fSxlLnJiaW5kPWZ1bmN0aW9uKHQscil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yP2UuQXJyYXkoYXJndW1lbnRzLDIsITApOm51bGw7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHM9bi5pc1N0cmluZyh0KT9yW3RdOnQsbz1pP2UuQXJyYXkoYXJndW1lbnRzLDAsITApLmNvbmNhdChpKTphcmd1bWVudHM7cmV0dXJuIHMuYXBwbHkocnx8cyxvKX19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1jdXN0b20tYmFzZSIsZnVuY3Rpb24oZSx0KXtlLkVudi5ldnQ9e2hhbmRsZXM6e30scGx1Z2luczp7fX07dmFyIG49MCxyPTEsaT17b2JqczpudWxsLGJlZm9yZTpmdW5jdGlvbih0LHIsaSxzKXt2YXIgbz10LHU7cmV0dXJuIHMmJih1PVt0LHNdLmNvbmNhdChlLkFycmF5KGFyZ3VtZW50cyw0LCEwKSksbz1lLnJiaW5kLmFwcGx5KGUsdSkpLHRoaXMuX2luamVjdChuLG8scixpKX0sYWZ0ZXI6ZnVuY3Rpb24odCxuLGkscyl7dmFyIG89dCx1O3JldHVybiBzJiYodT1bdCxzXS5jb25jYXQoZS5BcnJheShhcmd1bWVudHMsNCwhMCkpLG89ZS5yYmluZC5hcHBseShlLHUpKSx0aGlzLl9pbmplY3QocixvLG4saSl9LF9pbmplY3Q6ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM9ZS5zdGFtcChyKSxvLHU7cmV0dXJuIHIuX3l1aWFvcHx8KHIuX3l1aWFvcD17fSksbz1yLl95dWlhb3Asb1tpXXx8KG9baV09bmV3IGUuRG8uTWV0aG9kKHIsaSkscltpXT1mdW5jdGlvbigpe3JldHVybiBvW2ldLmV4ZWMuYXBwbHkob1tpXSxhcmd1bWVudHMpfSksdT1zK2Uuc3RhbXAobikraSxvW2ldLnJlZ2lzdGVyKHUsbix0KSxuZXcgZS5FdmVudEhhbmRsZShvW2ldLHUpfSxkZXRhY2g6ZnVuY3Rpb24oZSl7ZS5kZXRhY2gmJmUuZGV0YWNoKCl9fTtlLkRvPWksaS5NZXRob2Q9ZnVuY3Rpb24oZSx0KXt0aGlzLm9iaj1lLHRoaXMubWV0aG9kTmFtZT10LHRoaXMubWV0aG9kPWVbdF0sdGhpcy5iZWZvcmU9e30sdGhpcy5hZnRlcj17fX0saS5NZXRob2QucHJvdG90eXBlLnJlZ2lzdGVyPWZ1bmN0aW9uKGUsdCxuKXtuP3RoaXMuYWZ0ZXJbZV09dDp0aGlzLmJlZm9yZVtlXT10fSxpLk1ldGhvZC5wcm90b3R5cGUuX2RlbGV0ZT1mdW5jdGlvbihlKXtkZWxldGUgdGhpcy5iZWZvcmVbZV0sZGVsZXRlIHRoaXMuYWZ0ZXJbZV19LGkuTWV0aG9kLnByb3RvdHlwZS5leGVjPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5BcnJheShhcmd1bWVudHMsMCwhMCksbixyLHMsbz10aGlzLmJlZm9yZSx1PXRoaXMuYWZ0ZXIsYT0hMTtmb3IobiBpbiBvKWlmKG8uaGFzT3duUHJvcGVydHkobikpe3I9b1tuXS5hcHBseSh0aGlzLm9iaix0KTtpZihyKXN3aXRjaChyLmNvbnN0cnVjdG9yKXtjYXNlIGkuSGFsdDpyZXR1cm4gci5yZXRWYWw7Y2FzZSBpLkFsdGVyQXJnczp0PXIubmV3QXJnczticmVhaztjYXNlIGkuUHJldmVudDphPSEwO2JyZWFrO2RlZmF1bHQ6fX1hfHwocj10aGlzLm1ldGhvZC5hcHBseSh0aGlzLm9iaix0KSksaS5vcmlnaW5hbFJldFZhbD1yLGkuY3VycmVudFJldFZhbD1yO2ZvcihuIGluIHUpaWYodS5oYXNPd25Qcm9wZXJ0eShuKSl7cz11W25dLmFwcGx5KHRoaXMub2JqLHQpO2lmKHMmJnMuY29uc3RydWN0b3I9PT1pLkhhbHQpcmV0dXJuIHMucmV0VmFsO3MmJnMuY29uc3RydWN0b3I9PT1pLkFsdGVyUmV0dXJuJiYocj1zLm5ld1JldFZhbCxpLmN1cnJlbnRSZXRWYWw9cil9cmV0dXJuIHJ9LGkuQWx0ZXJBcmdzPWZ1bmN0aW9uKGUsdCl7dGhpcy5tc2c9ZSx0aGlzLm5ld0FyZ3M9dH0saS5BbHRlclJldHVybj1mdW5jdGlvbihlLHQpe3RoaXMubXNnPWUsdGhpcy5uZXdSZXRWYWw9dH0saS5IYWx0PWZ1bmN0aW9uKGUsdCl7dGhpcy5tc2c9ZSx0aGlzLnJldFZhbD10fSxpLlByZXZlbnQ9ZnVuY3Rpb24oZSl7dGhpcy5tc2c9ZX0saS5FcnJvcj1pLkhhbHQ7dmFyIHM9ZS5BcnJheSxvPSJhZnRlciIsdT1bImJyb2FkY2FzdCIsIm1vbml0b3JlZCIsImJ1YmJsZXMiLCJjb250ZXh0IiwiY29udGV4dEZuIiwiY3VycmVudFRhcmdldCIsImRlZmF1bHRGbiIsImRlZmF1bHRUYXJnZXRPbmx5IiwiZGV0YWlscyIsImVtaXRGYWNhZGUiLCJmaXJlT25jZSIsImFzeW5jIiwiaG9zdCIsInByZXZlbnRhYmxlIiwicHJldmVudGVkRm4iLCJxdWV1YWJsZSIsInNpbGVudCIsInN0b3BwZWRGbiIsInRhcmdldCIsInR5cGUiXSxhPXMuaGFzaCh1KSxmPUFycmF5LnByb3RvdHlwZS5zbGljZSxsPTksYz0ieXVpOmxvZyIsaD1mdW5jdGlvbihlLHQsbil7dmFyIHI7Zm9yKHIgaW4gdClhW3JdJiYobnx8IShyIGluIGUpKSYmKGVbcl09dFtyXSk7cmV0dXJuIGV9O2UuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24odCxuKXt0aGlzLl9rZHM9ZS5DdXN0b21FdmVudC5rZWVwRGVwcmVjYXRlZFN1YnMsdGhpcy5pZD1lLmd1aWQoKSx0aGlzLnR5cGU9dCx0aGlzLnNpbGVudD10aGlzLmxvZ1N5c3RlbT10PT09Yyx0aGlzLl9rZHMmJih0aGlzLnN1YnNjcmliZXJzPXt9LHRoaXMuYWZ0ZXJzPXt9KSxuJiZoKHRoaXMsbiwhMCl9LGUuQ3VzdG9tRXZlbnQua2VlcERlcHJlY2F0ZWRTdWJzPSExLGUuQ3VzdG9tRXZlbnQubWl4Q29uZmlncz1oLGUuQ3VzdG9tRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplLkN1c3RvbUV2ZW50LHNpZ25hdHVyZTpsLGNvbnRleHQ6ZSxwcmV2ZW50YWJsZTohMCxidWJibGVzOiEwLGhhc1N1YnM6ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPTAscj10aGlzLl9zdWJzY3JpYmVycyxpPXRoaXMuX2FmdGVycyxzPXRoaXMuc2libGluZztyZXR1cm4gciYmKHQ9ci5sZW5ndGgpLGkmJihuPWkubGVuZ3RoKSxzJiYocj1zLl9zdWJzY3JpYmVycyxpPXMuX2FmdGVycyxyJiYodCs9ci5sZW5ndGgpLGkmJihuKz1pLmxlbmd0aCkpLGU/ZT09PSJhZnRlciI/bjp0OnQrbn0sbW9uaXRvcjpmdW5jdGlvbihlKXt0aGlzLm1vbml0b3JlZD0hMDt2YXIgdD10aGlzLmlkKyJ8Iit0aGlzLnR5cGUrIl8iK2Usbj1mLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiBuWzBdPXQsdGhpcy5ob3N0Lm9uLmFwcGx5KHRoaXMuaG9zdCxuKX0sZ2V0U3ViczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuc2libGluZyx0PXRoaXMuX3N1YnNjcmliZXJzLG49dGhpcy5fYWZ0ZXJzLHIsaTtyZXR1cm4gZSYmKHI9ZS5fc3Vic2NyaWJlcnMsaT1lLl9hZnRlcnMpLHI/dD90PXQuY29uY2F0KHIpOnQ9ci5jb25jYXQoKTp0P3Q9dC5jb25jYXQoKTp0PVtdLGk/bj9uPW4uY29uY2F0KGkpOm49aS5jb25jYXQoKTpuP249bi5jb25jYXQoKTpuPVtdLFt0LG5dfSxhcHBseUNvbmZpZzpmdW5jdGlvbihlLHQpe2godGhpcyxlLHQpfSxfb246ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM9bmV3IGUuU3Vic2NyaWJlcih0LG4scixpKSx1O3JldHVybiB0aGlzLmZpcmVPbmNlJiZ0aGlzLmZpcmVkJiYodT10aGlzLmZpcmVkV2l0aCx0aGlzLmVtaXRGYWNhZGUmJnRoaXMuX2FkZEZhY2FkZVRvQXJncyYmdGhpcy5fYWRkRmFjYWRlVG9BcmdzKHUpLHRoaXMuYXN5bmM/c2V0VGltZW91dChlLmJpbmQodGhpcy5fbm90aWZ5LHRoaXMscyx1KSwwKTp0aGlzLl9ub3RpZnkocyx1KSksaT09PW8/KHRoaXMuX2FmdGVyc3x8KHRoaXMuX2FmdGVycz1bXSksdGhpcy5fYWZ0ZXJzLnB1c2gocykpOih0aGlzLl9zdWJzY3JpYmVyc3x8KHRoaXMuX3N1YnNjcmliZXJzPVtdKSx0aGlzLl9zdWJzY3JpYmVycy5wdXNoKHMpKSx0aGlzLl9rZHMmJihpPT09bz90aGlzLmFmdGVyc1tzLmlkXT1zOnRoaXMuc3Vic2NyaWJlcnNbcy5pZF09cyksbmV3IGUuRXZlbnRIYW5kbGUodGhpcyxzKX0sc3Vic2NyaWJlOmZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yP2YuY2FsbChhcmd1bWVudHMsMik6bnVsbDtyZXR1cm4gdGhpcy5fb24oZSx0LG4sITApfSxvbjpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+Mj9mLmNhbGwoYXJndW1lbnRzLDIpOm51bGw7cmV0dXJuIHRoaXMubW9uaXRvcmVkJiZ0aGlzLmhvc3QmJnRoaXMuaG9zdC5fbW9uaXRvcigiYXR0YWNoIix0aGlzLHthcmdzOmFyZ3VtZW50c30pLHRoaXMuX29uKGUsdCxuLCEwKX0sYWZ0ZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjI/Zi5jYWxsKGFyZ3VtZW50cywyKTpudWxsO3JldHVybiB0aGlzLl9vbihlLHQsbixvKX0sZGV0YWNoOmZ1bmN0aW9uKGUsdCl7aWYoZSYmZS5kZXRhY2gpcmV0dXJuIGUuZGV0YWNoKCk7dmFyIG4scixpPTAscz10aGlzLl9zdWJzY3JpYmVycyxvPXRoaXMuX2FmdGVycztpZihzKWZvcihuPXMubGVuZ3RoO24+PTA7bi0tKXI9c1tuXSxyJiYoIWV8fGU9PT1yLmZuKSYmKHRoaXMuX2RlbGV0ZShyLHMsbiksaSsrKTtpZihvKWZvcihuPW8ubGVuZ3RoO24+PTA7bi0tKXI9b1tuXSxyJiYoIWV8fGU9PT1yLmZuKSYmKHRoaXMuX2RlbGV0ZShyLG8sbiksaSsrKTtyZXR1cm4gaX0sdW5zdWJzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2guYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfbm90aWZ5OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gcj1lLm5vdGlmeSh0LHRoaXMpLCExPT09cnx8dGhpcy5zdG9wcGVkPjE/ITE6ITB9LGxvZzpmdW5jdGlvbihlLHQpe30sZmlyZTpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBlLnB1c2guYXBwbHkoZSxhcmd1bWVudHMpLHRoaXMuX2ZpcmUoZSl9LF9maXJlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmZpcmVPbmNlJiZ0aGlzLmZpcmVkPyEwOih0aGlzLmZpcmVkPSEwLHRoaXMuZmlyZU9uY2UmJih0aGlzLmZpcmVkV2l0aD1lKSx0aGlzLmVtaXRGYWNhZGU/dGhpcy5maXJlQ29tcGxleChlKTp0aGlzLmZpcmVTaW1wbGUoZSkpfSxmaXJlU2ltcGxlOmZ1bmN0aW9uKGUpe3RoaXMuc3RvcHBlZD0wLHRoaXMucHJldmVudGVkPTA7aWYodGhpcy5oYXNTdWJzKCkpe3ZhciB0PXRoaXMuZ2V0U3VicygpO3RoaXMuX3Byb2NTdWJzKHRbMF0sZSksdGhpcy5fcHJvY1N1YnModFsxXSxlKX1yZXR1cm4gdGhpcy5icm9hZGNhc3QmJnRoaXMuX2Jyb2FkY2FzdChlKSx0aGlzLnN0b3BwZWQ/ITE6ITB9LGZpcmVDb21wbGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdPWVbMF18fHt9LHRoaXMuZmlyZVNpbXBsZShlKX0sX3Byb2NTdWJzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHM7Zm9yKGk9MCxzPWUubGVuZ3RoO2k8cztpKyspe3I9ZVtpXTtpZihyJiZyLmZuKXshMT09PXRoaXMuX25vdGlmeShyLHQsbikmJih0aGlzLnN0b3BwZWQ9Mik7aWYodGhpcy5zdG9wcGVkPT09MilyZXR1cm4hMX19cmV0dXJuITB9LF9icm9hZGNhc3Q6ZnVuY3Rpb24odCl7aWYoIXRoaXMuc3RvcHBlZCYmdGhpcy5icm9hZGNhc3Qpe3ZhciBuPXQuY29uY2F0KCk7bi51bnNoaWZ0KHRoaXMudHlwZSksdGhpcy5ob3N0IT09ZSYmZS5maXJlLmFwcGx5KGUsbiksdGhpcy5icm9hZGNhc3Q9PT0yJiZlLkdsb2JhbC5maXJlLmFwcGx5KGUuR2xvYmFsLG4pfX0sdW5zdWJzY3JpYmVBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2hBbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxkZXRhY2hBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2goKX0sX2RlbGV0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5fd2hlbjt0fHwodD1yPT09bz90aGlzLl9hZnRlcnM6dGhpcy5fc3Vic2NyaWJlcnMpLHQmJihuPXMuaW5kZXhPZih0LGUsMCksZSYmdFtuXT09PWUmJnQuc3BsaWNlKG4sMSkpLHRoaXMuX2tkcyYmKHI9PT1vP2RlbGV0ZSB0aGlzLmFmdGVyc1tlLmlkXTpkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tlLmlkXSksdGhpcy5tb25pdG9yZWQmJnRoaXMuaG9zdCYmdGhpcy5ob3N0Ll9tb25pdG9yKCJkZXRhY2giLHRoaXMse2NlOnRoaXMsc3ViOmV9KSxlJiYoZS5kZWxldGVkPSEwKX19LGUuU3Vic2NyaWJlcj1mdW5jdGlvbih0LG4scixpKXt0aGlzLmZuPXQsdGhpcy5jb250ZXh0PW4sdGhpcy5pZD1lLmd1aWQoKSx0aGlzLmFyZ3M9cix0aGlzLl93aGVuPWl9LGUuU3Vic2NyaWJlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUuU3Vic2NyaWJlcixfbm90aWZ5OmZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLmRlbGV0ZWQmJiF0aGlzLnBvc3Rwb25lZCl7aWYoIXRoaXMucG9zdHBvbmVkKXJldHVybiBkZWxldGUgdGhpcy5wb3N0cG9uZWQsbnVsbDtkZWxldGUgdGhpcy5mbixkZWxldGUgdGhpcy5jb250ZXh0fXZhciByPXRoaXMuYXJncyxpO3N3aXRjaChuLnNpZ25hdHVyZSl7Y2FzZSAwOmk9dGhpcy5mbi5jYWxsKGUsbi50eXBlLHQsZSk7YnJlYWs7Y2FzZSAxOmk9dGhpcy5mbi5jYWxsKGUsdFswXXx8bnVsbCxlKTticmVhazsKZGVmYXVsdDpyfHx0Pyh0PXR8fFtdLHI9cj90LmNvbmNhdChyKTp0LGk9dGhpcy5mbi5hcHBseShlLHIpKTppPXRoaXMuZm4uY2FsbChlKX1yZXR1cm4gdGhpcy5vbmNlJiZuLl9kZWxldGUodGhpcyksaX0sbm90aWZ5OmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcy5jb250ZXh0LGk9ITA7cnx8KHI9bi5jb250ZXh0Rm4/bi5jb250ZXh0Rm4oKTpuLmNvbnRleHQpO2lmKGUuY29uZmlnJiZlLmNvbmZpZy50aHJvd0ZhaWwpaT10aGlzLl9ub3RpZnkocix0LG4pO2Vsc2UgdHJ5e2k9dGhpcy5fbm90aWZ5KHIsdCxuKX1jYXRjaChzKXtlLmVycm9yKHRoaXMrIiBmYWlsZWQ6ICIrcy5tZXNzYWdlLHMpfXJldHVybiBpfSxjb250YWluczpmdW5jdGlvbihlLHQpe3JldHVybiB0P3RoaXMuZm49PT1lJiZ0aGlzLmNvbnRleHQ9PT10OnRoaXMuZm49PT1lfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9fSxlLkV2ZW50SGFuZGxlPWZ1bmN0aW9uKGUsdCl7dGhpcy5ldnQ9ZSx0aGlzLnN1Yj10fSxlLkV2ZW50SGFuZGxlLnByb3RvdHlwZT17YmF0Y2g6ZnVuY3Rpb24odCxuKXt0LmNhbGwobnx8dGhpcyx0aGlzKSxlLkxhbmcuaXNBcnJheSh0aGlzLmV2dCkmJmUuQXJyYXkuZWFjaCh0aGlzLmV2dCxmdW5jdGlvbihlKXtlLmJhdGNoLmNhbGwobnx8ZSx0KX0pfSxkZXRhY2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmV2dCxuPTAscjtpZih0KWlmKGUuTGFuZy5pc0FycmF5KHQpKWZvcihyPTA7cjx0Lmxlbmd0aDtyKyspbis9dFtyXS5kZXRhY2goKTtlbHNlIHQuX2RlbGV0ZSh0aGlzLnN1Yiksbj0xO3JldHVybiBufSxtb25pdG9yOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmV2dC5tb25pdG9yLmFwcGx5KHRoaXMuZXZ0LGFyZ3VtZW50cyl9fTt2YXIgcD1lLkxhbmcsZD0iOiIsdj0ifCIsbT0ifkFGVEVSfiIsZz0vKC4qPykoOikoLio/KS8seT1lLmNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGcsIiokMiQzIil9KSxiPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIXR8fCFlfHxlLmluZGV4T2YoZCk+LTE/ZTp0K2QrZX0sdz1lLmNhY2hlZChmdW5jdGlvbihlLHQpe3ZhciBuPWUscixpLHM7cmV0dXJuIHAuaXNTdHJpbmcobik/KHM9bi5pbmRleE9mKG0pLHM+LTEmJihpPSEwLG49bi5zdWJzdHIobS5sZW5ndGgpKSxzPW4uaW5kZXhPZih2KSxzPi0xJiYocj1uLnN1YnN0cigwLHMpLG49bi5zdWJzdHIocysxKSxuPT09IioiJiYobj1udWxsKSksW3IsdD9iKG4sdCk6bixpLG5dKTpufSksRT1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl95dWlldnQscjtufHwobj10aGlzLl95dWlldnQ9e2V2ZW50czp7fSx0YXJnZXRzOm51bGwsY29uZmlnOntob3N0OnRoaXMsY29udGV4dDp0aGlzfSxjaGFpbjplLmNvbmZpZy5jaGFpbn0pLHI9bi5jb25maWcsdCYmKGgocix0LCEwKSx0LmNoYWluIT09dW5kZWZpbmVkJiYobi5jaGFpbj10LmNoYWluKSx0LnByZWZpeCYmKHIucHJlZml4PXQucHJlZml4KSl9O0UucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpFLG9uY2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZS5iYXRjaChmdW5jdGlvbihlKXtlLnN1YiYmKGUuc3ViLm9uY2U9ITApfSksZX0sb25jZUFmdGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5hZnRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGUuYmF0Y2goZnVuY3Rpb24oZSl7ZS5zdWImJihlLnN1Yi5vbmNlPSEwKX0pLGV9LHBhcnNlVHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiB3KGUsdHx8dGhpcy5feXVpZXZ0LmNvbmZpZy5wcmVmaXgpfSxvbjpmdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5feXVpZXZ0LHM9dyh0LGkuY29uZmlnLnByZWZpeCksbyx1LGEsbCxjLGgsZCx2PWUuRW52LmV2dC5oYW5kbGVzLGcseSxiLEU9ZS5Ob2RlLFMseCxUO3RoaXMuX21vbml0b3IoImF0dGFjaCIsc1sxXSx7YXJnczphcmd1bWVudHMsY2F0ZWdvcnk6c1swXSxhZnRlcjpzWzJdfSk7aWYocC5pc09iamVjdCh0KSlyZXR1cm4gcC5pc0Z1bmN0aW9uKHQpP2UuRG8uYmVmb3JlLmFwcGx5KGUuRG8sYXJndW1lbnRzKToobz1uLHU9cixhPWYuY2FsbChhcmd1bWVudHMsMCksbD1bXSxwLmlzQXJyYXkodCkmJihUPSEwKSxnPXQuX2FmdGVyLGRlbGV0ZSB0Ll9hZnRlcixlLmVhY2godCxmdW5jdGlvbihlLHQpe3AuaXNPYmplY3QoZSkmJihvPWUuZm58fChwLmlzRnVuY3Rpb24oZSk/ZTpvKSx1PWUuY29udGV4dHx8dSk7dmFyIG49Zz9tOiIiO2FbMF09bisoVD9lOnQpLGFbMV09byxhWzJdPXUsbC5wdXNoKHRoaXMub24uYXBwbHkodGhpcyxhKSl9LHRoaXMpLGkuY2hhaW4/dGhpczpuZXcgZS5FdmVudEhhbmRsZShsKSk7aD1zWzBdLGc9c1syXSxiPXNbM107aWYoRSYmZS5pbnN0YW5jZU9mKHRoaXMsRSkmJmIgaW4gRS5ET01fRVZFTlRTKXJldHVybiBhPWYuY2FsbChhcmd1bWVudHMsMCksYS5zcGxpY2UoMiwwLEUuZ2V0RE9NTm9kZSh0aGlzKSksZS5vbi5hcHBseShlLGEpO3Q9c1sxXTtpZihlLmluc3RhbmNlT2YodGhpcyxZVUkpKXt5PWUuRW52LmV2dC5wbHVnaW5zW3RdLGE9Zi5jYWxsKGFyZ3VtZW50cywwKSxhWzBdPWIsRSYmKFM9YVsyXSxlLmluc3RhbmNlT2YoUyxlLk5vZGVMaXN0KT9TPWUuTm9kZUxpc3QuZ2V0RE9NTm9kZXMoUyk6ZS5pbnN0YW5jZU9mKFMsRSkmJihTPUUuZ2V0RE9NTm9kZShTKSkseD1iIGluIEUuRE9NX0VWRU5UUyx4JiYoYVsyXT1TKSk7aWYoeSlkPXkub24uYXBwbHkoZSxhKTtlbHNlIGlmKCF0fHx4KWQ9ZS5FdmVudC5fYXR0YWNoKGEpfXJldHVybiBkfHwoYz1pLmV2ZW50c1t0XXx8dGhpcy5wdWJsaXNoKHQpLGQ9Yy5fb24obixyLGFyZ3VtZW50cy5sZW5ndGg+Mz9mLmNhbGwoYXJndW1lbnRzLDMpOm51bGwsZz8iYWZ0ZXIiOiEwKSx0LmluZGV4T2YoIio6IikhPT0tMSYmKHRoaXMuX2hhc1NpYmxpbmdzPSEwKSksaCYmKHZbaF09dltoXXx8e30sdltoXVt0XT12W2hdW3RdfHxbXSx2W2hdW3RdLnB1c2goZCkpLGkuY2hhaW4/dGhpczpkfSxzdWJzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGRldGFjaDpmdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5feXVpZXZ0LmV2ZW50cyxzLG89ZS5Ob2RlLHU9byYmZS5pbnN0YW5jZU9mKHRoaXMsbyk7aWYoIXQmJnRoaXMhPT1lKXtmb3IocyBpbiBpKWkuaGFzT3duUHJvcGVydHkocykmJmlbc10uZGV0YWNoKG4scik7cmV0dXJuIHUmJmUuRXZlbnQucHVyZ2VFbGVtZW50KG8uZ2V0RE9NTm9kZSh0aGlzKSksdGhpc312YXIgYT13KHQsdGhpcy5feXVpZXZ0LmNvbmZpZy5wcmVmaXgpLGw9cC5pc0FycmF5KGEpP2FbMF06bnVsbCxjPWE/YVszXTpudWxsLGgsZD1lLkVudi5ldnQuaGFuZGxlcyx2LG0sZyx5LGI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWVbdF0saSxzO2lmKHIpZm9yKHM9ci5sZW5ndGgtMTtzPj0wOy0tcylpPXJbc10uZXZ0LChpLmhvc3Q9PT1ufHxpLmVsPT09bikmJnJbc10uZGV0YWNoKCl9O2lmKGwpe209ZFtsXSx0PWFbMV0sdj11P2UuTm9kZS5nZXRET01Ob2RlKHRoaXMpOnRoaXM7aWYobSl7aWYodCliKG0sdCx2KTtlbHNlIGZvcihzIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShzKSYmYihtLHMsdik7cmV0dXJuIHRoaXN9fWVsc2V7aWYocC5pc09iamVjdCh0KSYmdC5kZXRhY2gpcmV0dXJuIHQuZGV0YWNoKCksdGhpcztpZih1JiYoIWN8fGMgaW4gby5ET01fRVZFTlRTKSlyZXR1cm4gZz1mLmNhbGwoYXJndW1lbnRzLDApLGdbMl09by5nZXRET01Ob2RlKHRoaXMpLGUuZGV0YWNoLmFwcGx5KGUsZyksdGhpc31oPWUuRW52LmV2dC5wbHVnaW5zW2NdO2lmKGUuaW5zdGFuY2VPZih0aGlzLFlVSSkpe2c9Zi5jYWxsKGFyZ3VtZW50cywwKTtpZihoJiZoLmRldGFjaClyZXR1cm4gaC5kZXRhY2guYXBwbHkoZSxnKSx0aGlzO2lmKCF0fHwhaCYmbyYmdCBpbiBvLkRPTV9FVkVOVFMpcmV0dXJuIGdbMF09dCxlLkV2ZW50LmRldGFjaC5hcHBseShlLkV2ZW50LGcpLHRoaXN9cmV0dXJuIHk9aVthWzFdXSx5JiZ5LmRldGFjaChuLHIpLHRoaXN9LHVuc3Vic2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGV0YWNoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZGV0YWNoQWxsOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRldGFjaChlKX0sdW5zdWJzY3JpYmVBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2hBbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxwdWJsaXNoOmZ1bmN0aW9uKHQsbil7dmFyIHIsaT10aGlzLl95dWlldnQscz1pLmNvbmZpZyxvPXMucHJlZml4O3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/KG8mJih0PWIodCxvKSkscj10aGlzLl9wdWJsaXNoKHQscyxuKSk6KHI9e30sZS5lYWNoKHQsZnVuY3Rpb24oZSx0KXtvJiYodD1iKHQsbykpLHJbdF09dGhpcy5fcHVibGlzaCh0LHMsZXx8bil9LHRoaXMpKSxyfSxfZ2V0RnVsbFR5cGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5feXVpZXZ0LmNvbmZpZy5wcmVmaXg7cmV0dXJuIHQ/dCtkK2U6ZX0sX3B1Ymxpc2g6ZnVuY3Rpb24odCxuLHIpe3ZhciBpLHM9dGhpcy5feXVpZXZ0LG89cy5jb25maWcsdT1vLmhvc3QsYT1vLmNvbnRleHQsZj1zLmV2ZW50cztyZXR1cm4gaT1mW3RdLChvLm1vbml0b3JlZCYmIWl8fGkmJmkubW9uaXRvcmVkKSYmdGhpcy5fbW9uaXRvcigicHVibGlzaCIsdCx7YXJnczphcmd1bWVudHN9KSxpfHwoaT1mW3RdPW5ldyBlLkN1c3RvbUV2ZW50KHQsbiksbnx8KGkuaG9zdD11LGkuY29udGV4dD1hKSksciYmaChpLHIsITApLGl9LF9tb25pdG9yOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHM7aWYodCl7dHlwZW9mIHQ9PSJzdHJpbmciPyhzPXQsaT10aGlzLmdldEV2ZW50KHQsITApKTooaT10LHM9dC50eXBlKTtpZih0aGlzLl95dWlldnQuY29uZmlnLm1vbml0b3JlZCYmKCFpfHxpLm1vbml0b3JlZCl8fGkmJmkubW9uaXRvcmVkKXI9cysiXyIrZSxuLm1vbml0b3JlZD1lLHRoaXMuZmlyZS5jYWxsKHRoaXMscixuKX19LGZpcmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dHlwZW9mIGU9PSJzdHJpbmciLG49YXJndW1lbnRzLmxlbmd0aCxyPWUsaT10aGlzLl95dWlldnQscz1pLmNvbmZpZyxvPXMucHJlZml4LHUsYSxsLGM7dCYmbjw9Mz9uPT09Mj9jPVthcmd1bWVudHNbMV1dOm49PT0zP2M9W2FyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl1dOmM9W106Yz1mLmNhbGwoYXJndW1lbnRzLHQ/MTowKSx0fHwocj1lJiZlLnR5cGUpLG8mJihyPWIocixvKSksYT1pLmV2ZW50c1tyXSx0aGlzLl9oYXNTaWJsaW5ncyYmKGw9dGhpcy5nZXRTaWJsaW5nKHIsYSksbCYmIWEmJihhPXRoaXMucHVibGlzaChyKSkpLChzLm1vbml0b3JlZCYmKCFhfHxhLm1vbml0b3JlZCl8fGEmJmEubW9uaXRvcmVkKSYmdGhpcy5fbW9uaXRvcigiZmlyZSIsYXx8cix7YXJnczpjfSk7aWYoIWEpe2lmKGkuaGFzVGFyZ2V0cylyZXR1cm4gdGhpcy5idWJibGUoe3R5cGU6cn0sYyx0aGlzKTt1PSEwfWVsc2UgbCYmKGEuc2libGluZz1sKSx1PWEuX2ZpcmUoYyk7cmV0dXJuIGkuY2hhaW4/dGhpczp1fSxnZXRTaWJsaW5nOmZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIGUuaW5kZXhPZihkKT4tMSYmKGU9eShlKSxuPXRoaXMuZ2V0RXZlbnQoZSwhMCksbiYmKG4uYXBwbHlDb25maWcodCksbi5idWJibGVzPSExLG4uYnJvYWRjYXN0PTApKSxufSxnZXRFdmVudDpmdW5jdGlvbihlLHQpe3ZhciBuLHI7cmV0dXJuIHR8fChuPXRoaXMuX3l1aWV2dC5jb25maWcucHJlZml4LGU9bj9iKGUsbik6ZSkscj10aGlzLl95dWlldnQuZXZlbnRzLHJbZV18fG51bGx9LGFmdGVyOmZ1bmN0aW9uKHQsbil7dmFyIHI9Zi5jYWxsKGFyZ3VtZW50cywwKTtzd2l0Y2gocC50eXBlKHQpKXtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gZS5Eby5hZnRlci5hcHBseShlLkRvLGFyZ3VtZW50cyk7Y2FzZSJhcnJheSI6Y2FzZSJvYmplY3QiOnJbMF0uX2FmdGVyPSEwO2JyZWFrO2RlZmF1bHQ6clswXT1tK3R9cmV0dXJuIHRoaXMub24uYXBwbHkodGhpcyxyKX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24uYXBwbHkKKHRoaXMsYXJndW1lbnRzKX19LGUuRXZlbnRUYXJnZXQ9RSxlLm1peChlLEUucHJvdG90eXBlKSxFLmNhbGwoZSx7YnViYmxlczohMX0pLFlVSS5FbnYuZ2xvYmFsRXZlbnRzPVlVSS5FbnYuZ2xvYmFsRXZlbnRzfHxuZXcgRSxlLkdsb2JhbD1ZVUkuRW52Lmdsb2JhbEV2ZW50c30sIjMuMTcuMiIse3JlcXVpcmVzOlsib29wIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImRvbS1jb3JlIixmdW5jdGlvbihlLHQpe3ZhciBuPSJub2RlVHlwZSIscj0ib3duZXJEb2N1bWVudCIsaT0iZG9jdW1lbnRFbGVtZW50IixzPSJkZWZhdWx0VmlldyIsbz0icGFyZW50V2luZG93Iix1PSJ0YWdOYW1lIixhPSJwYXJlbnROb2RlIixmPSJwcmV2aW91c1NpYmxpbmciLGw9Im5leHRTaWJsaW5nIixjPSJjb250YWlucyIsaD0iY29tcGFyZURvY3VtZW50UG9zaXRpb24iLHA9W10sZD1mdW5jdGlvbigpe3ZhciB0PWUuY29uZmlnLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKSxuPXQuYXBwZW5kQ2hpbGQoZS5jb25maWcuZG9jLmNyZWF0ZVRleHROb2RlKCIiKSkscj0hMTt0cnl7cj10LmNvbnRhaW5zKG4pfWNhdGNoKGkpe31yZXR1cm4gcn0oKSx2PXtieUlkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYuYWxsQnlJZChlLHQpWzBdfHxudWxsfSxnZXRJZDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gZS5pZCYmIWUuaWQudGFnTmFtZSYmIWUuaWQuaXRlbT90PWUuaWQ6ZS5hdHRyaWJ1dGVzJiZlLmF0dHJpYnV0ZXMuaWQmJih0PWUuYXR0cmlidXRlcy5pZC52YWx1ZSksdH0sc2V0SWQ6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHJpYnV0ZT9lLnNldEF0dHJpYnV0ZSgiaWQiLHQpOmUuaWQ9dH0sYW5jZXN0b3I6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9bnVsbDtyZXR1cm4gbiYmKGk9IXR8fHQoZSk/ZTpudWxsKSxpfHx2LmVsZW1lbnRCeUF4aXMoZSxhLHQsbnVsbCxyKX0sYW5jZXN0b3JzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUscz1bXTt3aGlsZShpPXYuYW5jZXN0b3IoaSx0LG4scikpe249ITE7aWYoaSl7cy51bnNoaWZ0KGkpO2lmKHImJnIoaSkpcmV0dXJuIHN9fXJldHVybiBzfSxlbGVtZW50QnlBeGlzOmZ1bmN0aW9uKGUsdCxuLHIsaSl7d2hpbGUoZSYmKGU9ZVt0XSkpe2lmKChyfHxlW3VdKSYmKCFufHxuKGUpKSlyZXR1cm4gZTtpZihpJiZpKGUpKXJldHVybiBudWxsfXJldHVybiBudWxsfSxjb250YWluczpmdW5jdGlvbihlLHQpe3ZhciByPSExO2lmKCF0fHwhZXx8IXRbbl18fCFlW25dKXI9ITE7ZWxzZSBpZihlW2NdJiYodFtuXT09PTF8fGQpKXI9ZVtjXSh0KTtlbHNlIGlmKGVbaF0pe2lmKGU9PT10fHwhIShlW2hdKHQpJjE2KSlyPSEwfWVsc2Ugcj12Ll9icnV0ZUNvbnRhaW5zKGUsdCk7cmV0dXJuIHJ9LGluRG9jOmZ1bmN0aW9uKGUsdCl7dmFyIG49ITEscztyZXR1cm4gZSYmZS5ub2RlVHlwZSYmKHR8fCh0PWVbcl0pLHM9dFtpXSxzJiZzLmNvbnRhaW5zJiZlLnRhZ05hbWU/bj1zLmNvbnRhaW5zKGUpOm49di5jb250YWlucyhzLGUpKSxufSxhbGxCeUlkOmZ1bmN0aW9uKHQsbil7bj1ufHxlLmNvbmZpZy5kb2M7dmFyIHI9W10saT1bXSxzLG87aWYobi5xdWVyeVNlbGVjdG9yQWxsKWk9bi5xdWVyeVNlbGVjdG9yQWxsKCdbaWQ9IicrdCsnIl0nKTtlbHNlIGlmKG4uYWxsKXtyPW4uYWxsKHQpO2lmKHIpe3Iubm9kZU5hbWUmJihyLmlkPT09dD8oaS5wdXNoKHIpLHI9cCk6cj1bcl0pO2lmKHIubGVuZ3RoKWZvcihzPTA7bz1yW3MrK107KShvLmlkPT09dHx8by5hdHRyaWJ1dGVzJiZvLmF0dHJpYnV0ZXMuaWQmJm8uYXR0cmlidXRlcy5pZC52YWx1ZT09PXQpJiZpLnB1c2gobyl9fWVsc2UgaT1bdi5fZ2V0RG9jKG4pLmdldEVsZW1lbnRCeUlkKHQpXTtyZXR1cm4gaX0saXNXaW5kb3c6ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5zY3JvbGxUbyYmZS5kb2N1bWVudCl9LF9yZW1vdmVDaGlsZE5vZGVzOmZ1bmN0aW9uKGUpe3doaWxlKGUuZmlyc3RDaGlsZCllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCl9LHNpYmxpbmdzOmZ1bmN0aW9uKGUsdCl7dmFyIG49W10scj1lO3doaWxlKHI9cltmXSlyW3VdJiYoIXR8fHQocikpJiZuLnVuc2hpZnQocik7cj1lO3doaWxlKHI9cltsXSlyW3VdJiYoIXR8fHQocikpJiZuLnB1c2gocik7cmV0dXJuIG59LF9icnV0ZUNvbnRhaW5zOmZ1bmN0aW9uKGUsdCl7d2hpbGUodCl7aWYoZT09PXQpcmV0dXJuITA7dD10LnBhcmVudE5vZGV9cmV0dXJuITF9LF9nZXRSZWdFeHA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD10fHwiIix2Ll9yZWdleENhY2hlPXYuX3JlZ2V4Q2FjaGV8fHt9LHYuX3JlZ2V4Q2FjaGVbZSt0XXx8KHYuX3JlZ2V4Q2FjaGVbZSt0XT1uZXcgUmVnRXhwKGUsdCkpLHYuX3JlZ2V4Q2FjaGVbZSt0XX0sX2dldERvYzpmdW5jdGlvbih0KXt2YXIgaT1lLmNvbmZpZy5kb2M7cmV0dXJuIHQmJihpPXRbbl09PT05P3Q6dFtyXXx8dC5kb2N1bWVudHx8ZS5jb25maWcuZG9jKSxpfSxfZ2V0V2luOmZ1bmN0aW9uKHQpe3ZhciBuPXYuX2dldERvYyh0KTtyZXR1cm4gbltzXXx8bltvXXx8ZS5jb25maWcud2lufSxfYmF0Y2g6ZnVuY3Rpb24oZSx0LG4scixpLHMpe3Q9dHlwZW9mIHQ9PSJzdHJpbmciP3ZbdF06dDt2YXIgbyx1PTAsYSxmO2lmKHQmJmUpd2hpbGUoYT1lW3UrK10pbz1vPXQuY2FsbCh2LGEsbixyLGkscyksdHlwZW9mIG8hPSJ1bmRlZmluZWQiJiYoZnx8KGY9W10pLGYucHVzaChvKSk7cmV0dXJuIHR5cGVvZiBmIT0idW5kZWZpbmVkIj9mOmV9LGdlbmVyYXRlSUQ6ZnVuY3Rpb24odCl7dmFyIG49dC5pZDtyZXR1cm4gbnx8KG49ZS5zdGFtcCh0KSx0LmlkPW4pLG59fTtlLkRPTT12fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJvb3AiLCJmZWF0dXJlcyJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkb20tYmFzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbmZpZy5kb2MuZG9jdW1lbnRFbGVtZW50LHI9ZS5ET00saT0idGFnTmFtZSIscz0ib3duZXJEb2N1bWVudCIsbz0iIix1PWUuRmVhdHVyZXMuYWRkLGE9ZS5GZWF0dXJlcy50ZXN0O2UubWl4KHIse2dldFRleHQ6bi50ZXh0Q29udGVudCE9PXVuZGVmaW5lZD9mdW5jdGlvbihlKXt2YXIgdD0iIjtyZXR1cm4gZSYmKHQ9ZS50ZXh0Q29udGVudCksdHx8IiJ9OmZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlJiYodD1lLmlubmVyVGV4dHx8ZS5ub2RlVmFsdWUpLHR8fCIifSxzZXRUZXh0Om4udGV4dENvbnRlbnQhPT11bmRlZmluZWQ/ZnVuY3Rpb24oZSx0KXtlJiYoZS50ZXh0Q29udGVudD10KX06ZnVuY3Rpb24oZSx0KXsiaW5uZXJUZXh0ImluIGU/ZS5pbm5lclRleHQ9dDoibm9kZVZhbHVlImluIGUmJihlLm5vZGVWYWx1ZT10KX0sQ1VTVE9NX0FUVFJJQlVURVM6bi5oYXNBdHRyaWJ1dGU/e2h0bWxGb3I6ImZvciIsY2xhc3NOYW1lOiJjbGFzcyJ9OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn0sc2V0QXR0cmlidXRlOmZ1bmN0aW9uKGUsdCxuLGkpe2UmJnQmJmUuc2V0QXR0cmlidXRlJiYodD1yLkNVU1RPTV9BVFRSSUJVVEVTW3RdfHx0LGUuc2V0QXR0cmlidXRlKHQsbixpKSl9LGdldEF0dHJpYnV0ZTpmdW5jdGlvbihlLHQsbil7bj1uIT09dW5kZWZpbmVkP246Mjt2YXIgaT0iIjtyZXR1cm4gZSYmdCYmZS5nZXRBdHRyaWJ1dGUmJih0PXIuQ1VTVE9NX0FUVFJJQlVURVNbdF18fHQsaT1lLnRhZ05hbWU9PT0iQlVUVE9OIiYmdD09PSJ2YWx1ZSI/ci5nZXRWYWx1ZShlKTplLmdldEF0dHJpYnV0ZSh0LG4pLGk9PT1udWxsJiYoaT0iIikpLGl9LFZBTFVFX1NFVFRFUlM6e30sVkFMVUVfR0VUVEVSUzp7fSxnZXRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0iIixuO3JldHVybiBlJiZlW2ldJiYobj1yLlZBTFVFX0dFVFRFUlNbZVtpXS50b0xvd2VyQ2FzZSgpXSxuP3Q9bihlKTp0PWUudmFsdWUpLHQ9PT1vJiYodD1vKSx0eXBlb2YgdD09InN0cmluZyI/dDoiIn0sc2V0VmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbjtlJiZlW2ldJiYobj1yLlZBTFVFX1NFVFRFUlNbZVtpXS50b0xvd2VyQ2FzZSgpXSx0PXQ9PT1udWxsPyIiOnQsbj9uKGUsdCk6ZS52YWx1ZT10KX0sY3JlYXRvcnM6e319KSx1KCJ2YWx1ZS1zZXQiLCJzZWxlY3QiLHt0ZXN0OmZ1bmN0aW9uKCl7dmFyIHQ9ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpO3JldHVybiB0LmlubmVySFRNTD0iPG9wdGlvbj4xPC9vcHRpb24+PG9wdGlvbj4yPC9vcHRpb24+Iix0LnZhbHVlPSIyIix0LnZhbHVlJiZ0LnZhbHVlPT09IjIifX0pLGEoInZhbHVlLXNldCIsInNlbGVjdCIpfHwoci5WQUxVRV9TRVRURVJTLnNlbGVjdD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLGk9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3B0aW9uIikscztzPWlbbisrXTspaWYoci5nZXRWYWx1ZShzKT09PXQpe3Muc2VsZWN0ZWQ9ITA7YnJlYWt9fSksZS5taXgoci5WQUxVRV9HRVRURVJTLHtidXR0b246ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXR0cmlidXRlcyYmZS5hdHRyaWJ1dGVzLnZhbHVlP2UuYXR0cmlidXRlcy52YWx1ZS52YWx1ZToiIn19KSxlLm1peChyLlZBTFVFX1NFVFRFUlMse2J1dHRvbjpmdW5jdGlvbihlLHQpe3ZhciBuPWUuYXR0cmlidXRlcy52YWx1ZTtufHwobj1lW3NdLmNyZWF0ZUF0dHJpYnV0ZSgidmFsdWUiKSxlLnNldEF0dHJpYnV0ZU5vZGUobikpLG4udmFsdWU9dH19KSxlLm1peChyLlZBTFVFX0dFVFRFUlMse29wdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1lLmF0dHJpYnV0ZXM7cmV0dXJuIHQudmFsdWUmJnQudmFsdWUuc3BlY2lmaWVkP2UudmFsdWU6ZS50ZXh0fSxzZWxlY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS52YWx1ZSxuPWUub3B0aW9ucztyZXR1cm4gbiYmbi5sZW5ndGgmJihlLm11bHRpcGxlfHxlLnNlbGVjdGVkSW5kZXg+LTEmJih0PXIuZ2V0VmFsdWUobltlLnNlbGVjdGVkSW5kZXhdKSkpLHR9fSk7dmFyIGYsbCxjO2UubWl4KGUuRE9NLHtoYXNDbGFzczpmdW5jdGlvbih0LG4pe3ZhciByPWUuRE9NLl9nZXRSZWdFeHAoIig/Ol58XFxzKykiK24rIig/Olxccyt8JCkiKTtyZXR1cm4gci50ZXN0KHQuY2xhc3NOYW1lKX0sYWRkQ2xhc3M6ZnVuY3Rpb24odCxuKXtlLkRPTS5oYXNDbGFzcyh0LG4pfHwodC5jbGFzc05hbWU9ZS5MYW5nLnRyaW0oW3QuY2xhc3NOYW1lLG5dLmpvaW4oIiAiKSkpfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0LG4pe24mJmwodCxuKSYmKHQuY2xhc3NOYW1lPWUuTGFuZy50cmltKHQuY2xhc3NOYW1lLnJlcGxhY2UoZS5ET00uX2dldFJlZ0V4cCgiKD86XnxcXHMrKSIrbisiKD86XFxzK3wkKSIpLCIgIikpLGwodCxuKSYmYyh0LG4pKX0scmVwbGFjZUNsYXNzOmZ1bmN0aW9uKGUsdCxuKXtjKGUsdCksZihlLG4pfSx0b2dnbGVDbGFzczpmdW5jdGlvbihlLHQsbil7dmFyIHI9biE9PXVuZGVmaW5lZD9uOiFsKGUsdCk7cj9mKGUsdCk6YyhlLHQpfX0pLGw9ZS5ET00uaGFzQ2xhc3MsYz1lLkRPTS5yZW1vdmVDbGFzcyxmPWUuRE9NLmFkZENsYXNzO3ZhciBoPS88KFthLXpdKykvaSxyPWUuRE9NLHU9ZS5GZWF0dXJlcy5hZGQsYT1lLkZlYXR1cmVzLnRlc3QscD17fSxkPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGk9ITA7ci5pbm5lckhUTUw9dDtpZighci5maXJzdENoaWxkfHxyLmZpcnN0Q2hpbGQudGFnTmFtZSE9PW4udG9VcHBlckNhc2UoKSlpPSExO3JldHVybiBpfSx2PS8oPzpcLyg/OnRoZWFkfHRmb290fHRib2R5fGNhcHRpb258Y29sfGNvbGdyb3VwKT4pK1xzKjx0Ym9keS8sbT0iPHRhYmxlPiIsZz0iPC90YWJsZT4iLHk7ZS5taXgoZS5ET00se19mcmFnQ2xvbmVzOnt9LF9jcmVhdGU6ZnVuY3Rpb24oZSx0LG4pe249bnx8ImRpdiI7dmFyIGk9ci5fZnJhZ0Nsb25lc1tuXTtyZXR1cm4gaT9pPWkuY2xvbmVOb2RlKCExKTppPXIuX2ZyYWdDbG9uZXNbbl09dC5jcmVhdGVFbGVtZW50KG4pLGkuaW5uZXJIVE1MPWUsaX0sX2NoaWxkcmVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPWUuY2hpbGRyZW4saSxzLG87ciYmci50YWdzJiYodD9yPWUuY2hpbGRyZW4udGFncyh0KTpzPXIudGFncygiISIpLmxlbmd0aCk7aWYoIXJ8fCFyLnRhZ3MmJnR8fHMpe2k9cnx8ZS5jaGlsZE5vZGVzLHI9W107d2hpbGUobz1pW24rK10pby5ub2RlVHlwZT09PTEmJighdHx8dD09PW8udGFnTmFtZSkmJnIucHVzaChvKX1yZXR1cm4gcnx8W119LGNyZWF0ZTpmdW5jdGlvbih0LG4pe3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9ZS5MYW5nLnRyaW0odCkpLG49bnx8ZS5jb25maWcuZG9jO3ZhciBpPWguZXhlYyh0KSxzPXIuX2NyZWF0ZSxvPXAsdT1udWxsLGEsZixsLGM7cmV0dXJuIHQhPXVuZGVmaW5lZCYmKGkmJmlbMV0mJihhPW9baVsxXS50b0xvd2VyQ2FzZSgpXSx0eXBlb2YgYT09ImZ1bmN0aW9uIj9zPWE6Zj1hKSxsPXModCxuLGYpLGM9bC5jaGlsZE5vZGVzLGMubGVuZ3RoPT09MT91PWwucmVtb3ZlQ2hpbGQoY1swXSk6Y1swXSYmY1swXS5jbGFzc05hbWU9PT0ieXVpMy1iaWctZHVtbXkiPyh5PWwuc2VsZWN0ZWRJbmRleCxjLmxlbmd0aD09PTI/dT1jWzBdLm5leHRTaWJsaW5nOihsLnJlbW92ZUNoaWxkKGNbMF0pLHU9ci5fbmwyZnJhZyhjLG4pKSk6dT1yLl9ubDJmcmFnKGMsbikpLHV9LF9ubDJmcmFnOmZ1bmN0aW9uKHQsbil7dmFyIHI9bnVsbCxpLHM7aWYodCYmKHQucHVzaHx8dC5pdGVtKSYmdFswXSl7bj1ufHx0WzBdLm93bmVyRG9jdW1lbnQscj1uLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSx0Lml0ZW0mJih0PWUuQXJyYXkodCwwLCEwKSk7Zm9yKGk9MCxzPXQubGVuZ3RoO2k8cztpKyspci5hcHBlbmRDaGlsZCh0W2ldKX1yZXR1cm4gcn0sYWRkSFRNTDpmdW5jdGlvbih0LG4saSl7dmFyIHM9dC5wYXJlbnROb2RlLG89MCx1LGE9bixmO2lmKG4hPXVuZGVmaW5lZClpZihuLm5vZGVUeXBlKWY9bjtlbHNlIGlmKHR5cGVvZiBuPT0ic3RyaW5nInx8dHlwZW9mIG49PSJudW1iZXIiKWE9Zj1yLmNyZWF0ZShuKTtlbHNlIGlmKG5bMF0mJm5bMF0ubm9kZVR5cGUpe2Y9ZS5jb25maWcuZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTt3aGlsZSh1PW5bbysrXSlmLmFwcGVuZENoaWxkKHUpfWlmKGkpaWYoZiYmaS5wYXJlbnROb2RlKWkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZixpKTtlbHNlIHN3aXRjaChpKXtjYXNlInJlcGxhY2UiOndoaWxlKHQuZmlyc3RDaGlsZCl0LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCk7ZiYmdC5hcHBlbmRDaGlsZChmKTticmVhaztjYXNlImJlZm9yZSI6ZiYmcy5pbnNlcnRCZWZvcmUoZix0KTticmVhaztjYXNlImFmdGVyIjpmJiYodC5uZXh0U2libGluZz9zLmluc2VydEJlZm9yZShmLHQubmV4dFNpYmxpbmcpOnMuYXBwZW5kQ2hpbGQoZikpO2JyZWFrO2RlZmF1bHQ6ZiYmdC5hcHBlbmRDaGlsZChmKX1lbHNlIGYmJnQuYXBwZW5kQ2hpbGQoZik7cmV0dXJuIHQubm9kZU5hbWU9PSJTRUxFQ1QiJiZ5PjAmJih0LnNlbGVjdGVkSW5kZXg9eS0xKSxhfSx3cmFwOmZ1bmN0aW9uKHQsbil7dmFyIHI9biYmbi5ub2RlVHlwZT9uOmUuRE9NLmNyZWF0ZShuKSxpPXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtpLmxlbmd0aCYmKHI9aVtpLmxlbmd0aC0xXSksdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHIsdCksci5hcHBlbmRDaGlsZCh0KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZSxuPXQubGFzdENoaWxkLHI9ZSxpO2lmKHQpe2k9dC5wYXJlbnROb2RlO2lmKGkpe2U9dC5maXJzdENoaWxkO3doaWxlKGUhPT1uKXI9ZS5uZXh0U2libGluZyxpLmluc2VydEJlZm9yZShlLHQpLGU9cjtpLnJlcGxhY2VDaGlsZChuLHQpfWVsc2UgdC5yZW1vdmVDaGlsZChlKX19fSksdSgiaW5uZXJodG1sIiwidGFibGUiLHt0ZXN0OmZ1bmN0aW9uKCl7dmFyIHQ9ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7dHJ5e3QuaW5uZXJIVE1MPSI8dGJvZHk+PC90Ym9keT4ifWNhdGNoKG4pe3JldHVybiExfXJldHVybiB0LmZpcnN0Q2hpbGQmJnQuZmlyc3RDaGlsZC5ub2RlTmFtZT09PSJUQk9EWSJ9fSksdSgiaW5uZXJodG1sLWRpdiIsInRyIix7dGVzdDpmdW5jdGlvbigpe3JldHVybiBkKCI8dHI+PC90cj4iLCJ0ciIpfX0pLHUoImlubmVyaHRtbC1kaXYiLCJzY3JpcHQiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIGQoIjxzY3JpcHQ+PC9zY3JpcHQ+Iiwic2NyaXB0Iil9fSksYSgiaW5uZXJodG1sIiwidGFibGUiKXx8KHAudGJvZHk9ZnVuY3Rpb24odCxuKXt2YXIgaT1yLmNyZWF0ZShtK3QrZyxuKSxzPWUuRE9NLl9jaGlsZHJlbihpLCJ0Ym9keSIpWzBdO3JldHVybiBpLmNoaWxkcmVuLmxlbmd0aD4xJiZzJiYhdi50ZXN0KHQpJiZzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocyksaX0pLGEoImlubmVyaHRtbC1kaXYiLCJzY3JpcHQiKXx8KHAuc2NyaXB0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gbi5pbm5lckhUTUw9Ii0iK2Usbi5yZW1vdmVDaGlsZChuLmZpcnN0Q2hpbGQpLG59LHAubGluaz1wLnN0eWxlPXAuc2NyaXB0KSxhKCJpbm5lcmh0bWwtZGl2IiwidHIiKXx8KGUubWl4KHAse29wdGlvbjpmdW5jdGlvbihlLHQpe3JldHVybiByLmNyZWF0ZSgnPHNlbGVjdD48b3B0aW9uIGNsYXNzPSJ5dWkzLWJpZy1kdW1teSIgc2VsZWN0ZWQ+PC9vcHRpb24+JytlKyI8L3NlbGVjdD4iLHQpfSx0cjpmdW5jdGlvbihlLHQpe3JldHVybiByLmNyZWF0ZSgiPHRib2R5PiIrZSsiPC90Ym9keT4iLHQpfSx0ZDpmdW5jdGlvbihlLHQpe3JldHVybiByLmNyZWF0ZSgiPHRyPiIrZSsiPC90cj4iLHQpfSxjb2w6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5jcmVhdGUoIjxjb2xncm91cD4iK2UrIjwvY29sZ3JvdXA+Iix0KX0sdGJvZHk6InRhYmxlIn0pLGUubWl4KHAse2xlZ2VuZDoiZmllbGRzZXQiCix0aDpwLnRkLHRoZWFkOnAudGJvZHksdGZvb3Q6cC50Ym9keSxjYXB0aW9uOnAudGJvZHksY29sZ3JvdXA6cC50Ym9keSxvcHRncm91cDpwLm9wdGlvbn0pKSxyLmNyZWF0b3JzPXAsZS5taXgoZS5ET00se3NldFdpZHRoOmZ1bmN0aW9uKHQsbil7ZS5ET00uX3NldFNpemUodCwid2lkdGgiLG4pfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCxuKXtlLkRPTS5fc2V0U2l6ZSh0LCJoZWlnaHQiLG4pfSxfc2V0U2l6ZTpmdW5jdGlvbihlLHQsbil7bj1uPjA/bjowO3ZhciByPTA7ZS5zdHlsZVt0XT1uKyJweCIscj10PT09ImhlaWdodCI/ZS5vZmZzZXRIZWlnaHQ6ZS5vZmZzZXRXaWR0aCxyPm4mJihuLT1yLW4sbjwwJiYobj0wKSxlLnN0eWxlW3RdPW4rInB4Iil9fSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1jb3JlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImNvbG9yLWJhc2UiLGZ1bmN0aW9uKGUsdCl7dmFyIG49L14jPyhbXGRhLWZBLUZdezJ9KShbXGRhLWZBLUZdezJ9KShbXGRhLWZBLUZdezJ9KShcdWZmZmUpPy8scj0vXiM/KFtcZGEtZkEtRl17MX0pKFtcZGEtZkEtRl17MX0pKFtcZGEtZkEtRl17MX0pKFx1ZmZmZSk/LyxpPS9yZ2JhP1woKFtcZF17MSwzfSksID8oW1xkXXsxLDN9KSwgPyhbXGRdezEsM30pLD8gPyhbLlxkXSopP1wpLyxzPXtIRVg6ImhleCIsUkdCOiJyZ2IiLFJHQkE6InJnYmEifSxvPXtoZXg6InRvSGV4IixyZ2I6InRvUkdCIixyZ2JhOiJ0b1JHQkEifTtlLkNvbG9yPXtLRVlXT1JEUzp7YmxhY2s6IjAwMCIsc2lsdmVyOiJjMGMwYzAiLGdyYXk6IjgwODA4MCIsd2hpdGU6ImZmZiIsbWFyb29uOiI4MDAwMDAiLHJlZDoiZjAwIixwdXJwbGU6IjgwMDA4MCIsZnVjaHNpYToiZjBmIixncmVlbjoiMDA4MDAwIixsaW1lOiIwZjAiLG9saXZlOiI4MDgwMDAiLHllbGxvdzoiZmYwIixuYXZ5OiIwMDAwODAiLGJsdWU6IjAwZiIsdGVhbDoiMDA4MDgwIixhcXVhOiIwZmYifSxSRUdFWF9IRVg6bixSRUdFWF9IRVgzOnIsUkVHRVhfUkdCOmkscmVfUkdCOmkscmVfaGV4Om4scmVfaGV4MzpyLFNUUl9IRVg6IiN7Kn17Kn17Kn0iLFNUUl9SR0I6InJnYih7Kn0sIHsqfSwgeyp9KSIsU1RSX1JHQkE6InJnYmEoeyp9LCB7Kn0sIHsqfSwgeyp9KSIsVFlQRVM6cyxDT05WRVJUUzpvLGNvbnZlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1lLkNvbG9yLkNPTlZFUlRTW24udG9Mb3dlckNhc2UoKV0saT10O3JldHVybiByJiZlLkNvbG9yW3JdJiYoaT1lLkNvbG9yW3JdKHQpKSxpfSx0b0hleDpmdW5jdGlvbih0KXt2YXIgbj1lLkNvbG9yLl9jb252ZXJ0VG8odCwiaGV4Iikscj1uLnRvTG93ZXJDYXNlKCk9PT0idHJhbnNwYXJlbnQiO3JldHVybiBuLmNoYXJBdCgwKSE9PSIjIiYmIXImJihuPSIjIituKSxyP24udG9Mb3dlckNhc2UoKTpuLnRvVXBwZXJDYXNlKCl9LHRvUkdCOmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IuX2NvbnZlcnRUbyh0LCJyZ2IiKTtyZXR1cm4gbi50b0xvd2VyQ2FzZSgpfSx0b1JHQkE6ZnVuY3Rpb24odCl7dmFyIG49ZS5Db2xvci5fY29udmVydFRvKHQsInJnYmEiKTtyZXR1cm4gbi50b0xvd2VyQ2FzZSgpfSx0b0FycmF5OmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IuZmluZFR5cGUodCkudG9VcHBlckNhc2UoKSxyLGkscyxvO3JldHVybiBuPT09IkhFWCImJnQubGVuZ3RoPDUmJihuPSJIRVgzIiksbi5jaGFyQXQobi5sZW5ndGgtMSk9PT0iQSImJihuPW4uc2xpY2UoMCwtMSkpLHI9ZS5Db2xvclsiUkVHRVhfIituXSxyJiYoaT1yLmV4ZWModCl8fFtdLHM9aS5sZW5ndGgscyYmKGkuc2hpZnQoKSxzLS0sbj09PSJIRVgzIiYmKGlbMF0rPWlbMF0saVsxXSs9aVsxXSxpWzJdKz1pWzJdKSxvPWlbcy0xXSxvfHwoaVtzLTFdPTEpKSksaX0sZnJvbUFycmF5OmZ1bmN0aW9uKHQsbil7dD10LmNvbmNhdCgpO2lmKHR5cGVvZiBuPT0idW5kZWZpbmVkIilyZXR1cm4gdC5qb2luKCIsICIpO3ZhciByPSJ7Kn0iO249ZS5Db2xvclsiU1RSXyIrbi50b1VwcGVyQ2FzZSgpXSx0Lmxlbmd0aD09PTMmJm4ubWF0Y2goL1x7XCpcfS9nKS5sZW5ndGg9PT00JiZ0LnB1c2goMSk7d2hpbGUobi5pbmRleE9mKHIpPj0wJiZ0Lmxlbmd0aD4wKW49bi5yZXBsYWNlKHIsdC5zaGlmdCgpKTtyZXR1cm4gbn0sZmluZFR5cGU6ZnVuY3Rpb24odCl7aWYoZS5Db2xvci5LRVlXT1JEU1t0XSlyZXR1cm4ia2V5d29yZCI7dmFyIG49dC5pbmRleE9mKCIoIikscjtyZXR1cm4gbj4wJiYocj10LnN1YnN0cigwLG4pKSxyJiZlLkNvbG9yLlRZUEVTW3IudG9VcHBlckNhc2UoKV0/ZS5Db2xvci5UWVBFU1tyLnRvVXBwZXJDYXNlKCldOiJoZXgifSxfZ2V0QWxwaGE6ZnVuY3Rpb24odCl7dmFyIG4scj1lLkNvbG9yLnRvQXJyYXkodCk7cmV0dXJuIHIubGVuZ3RoPjMmJihuPXIucG9wKCkpLCtufHwxfSxfa2V5d29yZFRvSGV4OmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IuS0VZV09SRFNbdF07aWYobilyZXR1cm4gbn0sX2NvbnZlcnRUbzpmdW5jdGlvbih0LG4pe2lmKHQ9PT0idHJhbnNwYXJlbnQiKXJldHVybiB0O3ZhciByPWUuQ29sb3IuZmluZFR5cGUodCksaT1uLHMsbyx1LGE7cmV0dXJuIHI9PT0ia2V5d29yZCImJih0PWUuQ29sb3IuX2tleXdvcmRUb0hleCh0KSxyPSJoZXgiKSxyPT09ImhleCImJnQubGVuZ3RoPDUmJih0LmNoYXJBdCgwKT09PSIjIiYmKHQ9dC5zdWJzdHIoMSkpLHQ9IiMiK3QuY2hhckF0KDApK3QuY2hhckF0KDApK3QuY2hhckF0KDEpK3QuY2hhckF0KDEpK3QuY2hhckF0KDIpK3QuY2hhckF0KDIpKSxyPT09bj90OihyLmNoYXJBdChyLmxlbmd0aC0xKT09PSJhIiYmKHI9ci5zbGljZSgwLC0xKSkscz1uLmNoYXJBdChuLmxlbmd0aC0xKT09PSJhIixzJiYobj1uLnNsaWNlKDAsLTEpLG89ZS5Db2xvci5fZ2V0QWxwaGEodCkpLGE9bi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStuLnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpLHU9ZS5Db2xvclsiXyIrcisiVG8iK2FdLHV8fHIhPT0icmdiIiYmbiE9PSJyZ2IiJiYodD1lLkNvbG9yWyJfIityKyJUb1JnYiJdKHQpLHI9InJnYiIsdT1lLkNvbG9yWyJfIityKyJUbyIrYV0pLHUmJih0PXUodCxzKSkscyYmKGUuTGFuZy5pc0FycmF5KHQpfHwodD1lLkNvbG9yLnRvQXJyYXkodCkpLHQucHVzaChvKSx0PWUuQ29sb3IuZnJvbUFycmF5KHQsaS50b1VwcGVyQ2FzZSgpKSksdCl9LF9oZXhUb1JnYjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtyZXR1cm4gZS5jaGFyQXQoMCk9PT0iIyImJihlPWUuc3Vic3RyKDEpKSxlPXBhcnNlSW50KGUsMTYpLG49ZT4+MTYscj1lPj44JjI1NSxpPWUmMjU1LHQ/W24scixpXToicmdiKCIrbisiLCAiK3IrIiwgIitpKyIpIn0sX3JnYlRvSGV4OmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IudG9BcnJheSh0KSxyPW5bMl18blsxXTw8OHxuWzBdPDwxNjtyPSgrcikudG9TdHJpbmcoMTYpO3doaWxlKHIubGVuZ3RoPDYpcj0iMCIrcjtyZXR1cm4iIyIrcn19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkb20tc3R5bGUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ImRvY3VtZW50RWxlbWVudCIscj0iZGVmYXVsdFZpZXciLGk9Im93bmVyRG9jdW1lbnQiLHM9InN0eWxlIixvPSJmbG9hdCIsdT0iY3NzRmxvYXQiLGE9InN0eWxlRmxvYXQiLGY9InRyYW5zcGFyZW50IixsPSJnZXRDb21wdXRlZFN0eWxlIixjPSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLGg9ZS5jb25maWcuZG9jLHA9ZS5ET00sZCx2LG09WyJXZWJraXRUcmFuc2Zvcm0iLCJNb3pUcmFuc2Zvcm0iLCJPVHJhbnNmb3JtIiwibXNUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iXSxnPS93aWR0aHxoZWlnaHR8dG9wfGxlZnR8cmlnaHR8Ym90dG9tfG1hcmdpbnxwYWRkaW5nL2k7ZS5BcnJheS5lYWNoKG0sZnVuY3Rpb24oZSl7ZSBpbiBoW25dLnN0eWxlJiYoZD1lLHY9ZSsiT3JpZ2luIil9KSxlLm1peChwLHtERUZBVUxUX1VOSVQ6InB4IixDVVNUT01fU1RZTEVTOnt9LHNldFN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe3I9cnx8ZS5zdHlsZTt2YXIgaT1wLkNVU1RPTV9TVFlMRVM7aWYocil7bj09PW51bGx8fG49PT0iIj9uPSIiOiFpc05hTihOdW1iZXIobikpJiZnLnRlc3QodCkmJihuKz1wLkRFRkFVTFRfVU5JVCk7aWYodCBpbiBpKXtpZihpW3RdLnNldCl7aVt0XS5zZXQoZSxuLHIpO3JldHVybn10eXBlb2YgaVt0XT09InN0cmluZyImJih0PWlbdF0pfWVsc2UgdD09PSIiJiYodD0iY3NzVGV4dCIsbj0iIik7clt0XT1ufX0sZ2V0U3R5bGU6ZnVuY3Rpb24oZSx0LG4pe249bnx8ZS5zdHlsZTt2YXIgcj1wLkNVU1RPTV9TVFlMRVMsaT0iIjtpZihuKXtpZih0IGluIHIpe2lmKHJbdF0uZ2V0KXJldHVybiByW3RdLmdldChlLHQsbik7dHlwZW9mIHJbdF09PSJzdHJpbmciJiYodD1yW3RdKX1pPW5bdF0saT09PSIiJiYoaT1wW2xdKGUsdCkpfXJldHVybiBpfSxzZXRTdHlsZXM6ZnVuY3Rpb24odCxuKXt2YXIgcj10LnN0eWxlO2UuZWFjaChuLGZ1bmN0aW9uKGUsbil7cC5zZXRTdHlsZSh0LG4sZSxyKX0scCl9LGdldENvbXB1dGVkU3R5bGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIixvPWVbaV0sdTtyZXR1cm4gZVtzXSYmb1tyXSYmb1tyXVtsXSYmKHU9b1tyXVtsXShlLG51bGwpLHUmJihuPXVbdF0pKSxufX0pLGhbbl1bc11bdV0hPT11bmRlZmluZWQ/cC5DVVNUT01fU1RZTEVTW29dPXU6aFtuXVtzXVthXSE9PXVuZGVmaW5lZCYmKHAuQ1VTVE9NX1NUWUxFU1tvXT1hKSxlLlVBLndlYmtpdCYmKHBbbF09ZnVuY3Rpb24oZSx0KXt2YXIgbj1lW2ldW3JdLHM9bltsXShlLCIiKVt0XTtyZXR1cm4gcz09PSJyZ2JhKDAsIDAsIDAsIDApIiYmKHM9Ziksc30pLGUuRE9NLl9nZXRBdHRyT2Zmc2V0PWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5ET01bbF0odCxuKSxpPXQub2Zmc2V0UGFyZW50LHMsbyx1O3JldHVybiByPT09ImF1dG8iJiYocz1lLkRPTS5nZXRTdHlsZSh0LCJwb3NpdGlvbiIpLHM9PT0ic3RhdGljInx8cz09PSJyZWxhdGl2ZSI/cj0wOmkmJmlbY10mJihvPWlbY10oKVtuXSx1PXRbY10oKVtuXSxuPT09ImxlZnQifHxuPT09InRvcCI/cj11LW86cj1vLXRbY10oKVtuXSkpLHJ9LGUuRE9NLl9nZXRPZmZzZXQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1udWxsO3JldHVybiBlJiYodD1wLmdldFN0eWxlKGUsInBvc2l0aW9uIiksbj1bcGFyc2VJbnQocFtsXShlLCJsZWZ0IiksMTApLHBhcnNlSW50KHBbbF0oZSwidG9wIiksMTApXSxpc05hTihuWzBdKSYmKG5bMF09cGFyc2VJbnQocC5nZXRTdHlsZShlLCJsZWZ0IiksMTApLGlzTmFOKG5bMF0pJiYoblswXT10PT09InJlbGF0aXZlIj8wOmUub2Zmc2V0TGVmdHx8MCkpLGlzTmFOKG5bMV0pJiYoblsxXT1wYXJzZUludChwLmdldFN0eWxlKGUsInRvcCIpLDEwKSxpc05hTihuWzFdKSYmKG5bMV09dD09PSJyZWxhdGl2ZSI/MDplLm9mZnNldFRvcHx8MCkpKSxufSxkJiYocC5DVVNUT01fU1RZTEVTLnRyYW5zZm9ybT17c2V0OmZ1bmN0aW9uKGUsdCxuKXtuW2RdPXR9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gcFtsXShlLGQpfX0scC5DVVNUT01fU1RZTEVTLnRyYW5zZm9ybU9yaWdpbj17c2V0OmZ1bmN0aW9uKGUsdCxuKXtuW3ZdPXR9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gcFtsXShlLHYpfX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJkb20tYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJzZWxlY3Rvci1uYXRpdmUiLGZ1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKGUpe2UubmFtZXNwYWNlKCJTZWxlY3RvciIpO3ZhciB0PSJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsbj0ib3duZXJEb2N1bWVudCIscj17X3R5cGVzOntlc2M6e3Rva2VuOiJcdWUwMDAiLHJlOi9cXFs6XFtcXVwoXCkjXC5cJ1w+K34iXS9naX0sYXR0cjp7dG9rZW46Ilx1ZTAwMSIscmU6LyhcW1teXF1dKlxdKS9nfSxwc2V1ZG86e3Rva2VuOiJcdWUwMDIiLHJlOi8oXChbXlwpXSpcKSkvZ319LHVzZU5hdGl2ZTohMCxfZXNjYXBlSWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJihlPWUucmVwbGFjZSgvKFs6XFtcXVwoXCkjXC4nPD4rfiJdKS9nLCJcXCQxIikpLGV9LF9jb21wYXJlOiJzb3VyY2VJbmRleCJpbiBlLmNvbmZpZy5kb2MuZG9jdW1lbnRFbGVtZW50P2Z1bmN0aW9uKGUsdCl7dmFyIG49ZS5zb3VyY2VJbmRleCxyPXQuc291cmNlSW5kZXg7cmV0dXJuIG49PT1yPzA6bj5yPzE6LTF9OmUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnRbdF0/ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZVt0XShuKSY0Py0xOjF9OmZ1bmN0aW9uKGUsdCl7dmFyIHIsaSxzO3JldHVybiBlJiZ0JiYocj1lW25dLmNyZWF0ZVJhbmdlKCksci5zZXRTdGFydChlLDApLGk9dFtuXS5jcmVhdGVSYW5nZSgpLGkuc2V0U3RhcnQodCwwKSxzPXIuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKDEsaSkpLHN9LF9zb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYodD1lLkFycmF5KHQsMCwhMCksdC5zb3J0JiZ0LnNvcnQoci5fY29tcGFyZSkpLHR9LF9kZUR1cGU6ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbixyO2ZvcihuPTA7cj1lW24rK107KXIuX2ZvdW5kfHwodFt0Lmxlbmd0aF09cixyLl9mb3VuZD0hMCk7Zm9yKG49MDtyPXRbbisrXTspci5fZm91bmQ9bnVsbCxyLnJlbW92ZUF0dHJpYnV0ZSgiX2ZvdW5kIik7cmV0dXJuIHR9LHF1ZXJ5OmZ1bmN0aW9uKHQsbixpLHMpe249bnx8ZS5jb25maWcuZG9jO3ZhciBvPVtdLHU9ZS5TZWxlY3Rvci51c2VOYXRpdmUmJmUuY29uZmlnLmRvYy5xdWVyeVNlbGVjdG9yJiYhcyxhPVtbdCxuXV0sZixsLGMsaD11P2UuU2VsZWN0b3IuX25hdGl2ZVF1ZXJ5OmUuU2VsZWN0b3IuX2JydXRlUXVlcnk7aWYodCYmaCl7IXMmJighdXx8bi50YWdOYW1lKSYmKGE9ci5fc3BsaXRRdWVyaWVzKHQsbikpO2ZvcihjPTA7Zj1hW2MrK107KWw9aChmWzBdLGZbMV0saSksaXx8KGw9ZS5BcnJheShsLDAsITApKSxsJiYobz1vLmNvbmNhdChsKSk7YS5sZW5ndGg+MSYmKG89ci5fc29ydChyLl9kZUR1cGUobykpKX1yZXR1cm4gaT9vWzBdfHxudWxsOm99LF9yZXBsYWNlU2VsZWN0b3I6ZnVuY3Rpb24odCl7dmFyIG49ZS5TZWxlY3Rvci5fcGFyc2UoImVzYyIsdCksaSxzO3JldHVybiB0PWUuU2VsZWN0b3IuX3JlcGxhY2UoImVzYyIsdCkscz1lLlNlbGVjdG9yLl9wYXJzZSgicHNldWRvIix0KSx0PXIuX3JlcGxhY2UoInBzZXVkbyIsdCksaT1lLlNlbGVjdG9yLl9wYXJzZSgiYXR0ciIsdCksdD1lLlNlbGVjdG9yLl9yZXBsYWNlKCJhdHRyIix0KSx7ZXNjOm4sYXR0cnM6aSxwc2V1ZG9zOnMsc2VsZWN0b3I6dH19LF9yZXN0b3JlU2VsZWN0b3I6ZnVuY3Rpb24odCl7dmFyIG49dC5zZWxlY3RvcjtyZXR1cm4gbj1lLlNlbGVjdG9yLl9yZXN0b3JlKCJhdHRyIixuLHQuYXR0cnMpLG49ZS5TZWxlY3Rvci5fcmVzdG9yZSgicHNldWRvIixuLHQucHNldWRvcyksbj1lLlNlbGVjdG9yLl9yZXN0b3JlKCJlc2MiLG4sdC5lc2MpLG59LF9yZXBsYWNlQ29tbWFzOmZ1bmN0aW9uKHQpe3ZhciBuPWUuU2VsZWN0b3IuX3JlcGxhY2VTZWxlY3Rvcih0KSx0PW4uc2VsZWN0b3I7cmV0dXJuIHQmJih0PXQucmVwbGFjZSgvLC9nLCJcdWUwMDciKSxuLnNlbGVjdG9yPXQsdD1lLlNlbGVjdG9yLl9yZXN0b3JlU2VsZWN0b3IobikpLHR9LF9zcGxpdFF1ZXJpZXM6ZnVuY3Rpb24odCxuKXt0LmluZGV4T2YoIiwiKT4tMSYmKHQ9ZS5TZWxlY3Rvci5fcmVwbGFjZUNvbW1hcyh0KSk7dmFyIHI9dC5zcGxpdCgiXHVlMDA3IiksaT1bXSxzPSIiLG8sdSxhO2lmKG4pe24ubm9kZVR5cGU9PT0xJiYobz1lLlNlbGVjdG9yLl9lc2NhcGVJZChlLkRPTS5nZXRJZChuKSksb3x8KG89ZS5ndWlkKCksZS5ET00uc2V0SWQobixvKSkscz0nW2lkPSInK28rJyJdICcpO2Zvcih1PTAsYT1yLmxlbmd0aDt1PGE7Kyt1KXQ9cytyW3VdLGkucHVzaChbdCxuXSl9cmV0dXJuIGl9LF9uYXRpdmVRdWVyeTpmdW5jdGlvbih0LG4scil7aWYoKGUuVUEud2Via2l0fHxlLlVBLm9wZXJhKSYmdC5pbmRleE9mKCI6Y2hlY2tlZCIpPi0xJiZlLlNlbGVjdG9yLnBzZXVkb3MmJmUuU2VsZWN0b3IucHNldWRvcy5jaGVja2VkKXJldHVybiBlLlNlbGVjdG9yLnF1ZXJ5KHQsbixyLCEwKTt0cnl7cmV0dXJuIG5bInF1ZXJ5U2VsZWN0b3IiKyhyPyIiOiJBbGwiKV0odCl9Y2F0Y2goaSl7cmV0dXJuIGUuU2VsZWN0b3IucXVlcnkodCxuLHIsITApfX0sZmlsdGVyOmZ1bmN0aW9uKHQsbil7dmFyIHI9W10saSxzO2lmKHQmJm4pZm9yKGk9MDtzPXRbaSsrXTspZS5TZWxlY3Rvci50ZXN0KHMsbikmJihyW3IubGVuZ3RoXT1zKTtyZXR1cm4gcn0sdGVzdDpmdW5jdGlvbih0LHIsaSl7dmFyIHM9ITEsbz0hMSx1LGEsZixsLGMsaCxwLGQsdjtpZih0JiZ0LnRhZ05hbWUpaWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpcz1yLmNhbGwodCx0KTtlbHNle3U9ci5zcGxpdCgiLCIpLCFpJiYhZS5ET00uaW5Eb2ModCkmJihhPXQucGFyZW50Tm9kZSxhP2k9YTooYz10W25dLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxjLmFwcGVuZENoaWxkKHQpLGk9YyxvPSEwKSksaT1pfHx0W25dLGg9ZS5TZWxlY3Rvci5fZXNjYXBlSWQoZS5ET00uZ2V0SWQodCkpLGh8fChoPWUuZ3VpZCgpLGUuRE9NLnNldElkKHQsaCkpO2ZvcihwPTA7dj11W3ArK107KXt2Kz0nW2lkPSInK2grJyJdJyxsPWUuU2VsZWN0b3IucXVlcnkodixpKTtmb3IoZD0wO2Y9bFtkKytdOylpZihmPT09dCl7cz0hMDticmVha31pZihzKWJyZWFrfW8mJmMucmVtb3ZlQ2hpbGQodCl9cmV0dXJuIHN9LGFuY2VzdG9yOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gZS5ET00uYW5jZXN0b3IodCxmdW5jdGlvbih0KXtyZXR1cm4gZS5TZWxlY3Rvci50ZXN0KHQsbil9LHIpfSxfcGFyc2U6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5tYXRjaChlLlNlbGVjdG9yLl90eXBlc1t0XS5yZSl9LF9yZXBsYWNlOmZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5TZWxlY3Rvci5fdHlwZXNbdF07cmV0dXJuIG4ucmVwbGFjZShyLnJlLHIudG9rZW4pfSxfcmVzdG9yZTpmdW5jdGlvbih0LG4scil7aWYocil7dmFyIGk9ZS5TZWxlY3Rvci5fdHlwZXNbdF0udG9rZW4scyxvO2ZvcihzPTAsbz1yLmxlbmd0aDtzPG87KytzKW49bi5yZXBsYWNlKGkscltzXSl9cmV0dXJuIG59fTtlLm1peChlLlNlbGVjdG9yLHIsITApfSkoZSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInNlbGVjdG9yIixmdW5jdGlvbihlLHQpe30sIjMuMTcuMiIse3JlcXVpcmVzOlsic2VsZWN0b3ItbmF0aXZlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtY29yZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj0iLiIscj0ibm9kZU5hbWUiLGk9Im5vZGVUeXBlIixzPSJvd25lckRvY3VtZW50IixvPSJ0YWdOYW1lIix1PSJfeXVpZCIsYT17fSxmPUFycmF5LnByb3RvdHlwZS5zbGljZSxsPWUuRE9NLGM9ZnVuY3Rpb24odCl7aWYoIXRoaXMuZ2V0RE9NTm9kZSlyZXR1cm4gbmV3IGModCk7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt0PWMuX2Zyb21TdHJpbmcodCk7aWYoIXQpcmV0dXJuIG51bGx9dmFyIG49dC5ub2RlVHlwZSE9PTk/dC51bmlxdWVJRDp0W3VdO24mJmMuX2luc3RhbmNlc1tuXSYmYy5faW5zdGFuY2VzW25dLl9ub2RlIT09dCYmKHRbdV09bnVsbCksbj1ufHxlLnN0YW1wKHQpLG58fChuPWUuZ3VpZCgpKSx0aGlzW3VdPW4sdGhpcy5fbm9kZT10LHRoaXMuX3N0YXRlUHJveHk9dCx0aGlzLl9pbml0UGx1Z2lucyYmdGhpcy5faW5pdFBsdWdpbnMoKX0saD1mdW5jdGlvbih0KXt2YXIgbj1udWxsO3JldHVybiB0JiYobj10eXBlb2YgdD09InN0cmluZyI/ZnVuY3Rpb24obil7cmV0dXJuIGUuU2VsZWN0b3IudGVzdChuLHQpfTpmdW5jdGlvbihuKXtyZXR1cm4gdChlLm9uZShuKSl9KSxufTtjLkFUVFJTPXt9LGMuRE9NX0VWRU5UUz17fSxjLl9mcm9tU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYodC5pbmRleE9mKCJkb2MiKT09PTA/dD1lLmNvbmZpZy5kb2M6dC5pbmRleE9mKCJ3aW4iKT09PTA/dD1lLmNvbmZpZy53aW46dD1lLlNlbGVjdG9yLnF1ZXJ5KHQsbnVsbCwhMCkpLHR8fG51bGx9LGMuTkFNRT0ibm9kZSIsYy5yZV9hcmlhPS9eKD86cm9sZSR8YXJpYS0pLyxjLlNIT1dfVFJBTlNJVElPTj0iZmFkZUluIixjLkhJREVfVFJBTlNJVElPTj0iZmFkZU91dCIsYy5faW5zdGFuY2VzPXt9LGMuZ2V0RE9NTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZT9lLm5vZGVUeXBlP2U6ZS5fbm9kZXx8bnVsbDpudWxsfSxjLnNjcnViVmFsPWZ1bmN0aW9uKHQsbil7aWYodCl7aWYodHlwZW9mIHQ9PSJvYmplY3QifHx0eXBlb2YgdD09ImZ1bmN0aW9uIilpZihpIGluIHR8fGwuaXNXaW5kb3codCkpdD1lLm9uZSh0KTtlbHNlIGlmKHQuaXRlbSYmIXQuX25vZGVzfHx0WzBdJiZ0WzBdW2ldKXQ9ZS5hbGwodCl9ZWxzZSB0eXBlb2YgdD09InVuZGVmaW5lZCI/dD1uOnQ9PT1udWxsJiYodD1udWxsKTtyZXR1cm4gdH0sYy5hZGRNZXRob2Q9ZnVuY3Rpb24oZSx0LG4pe2UmJnQmJnR5cGVvZiB0PT0iZnVuY3Rpb24iJiYoYy5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgZT1mLmNhbGwoYXJndW1lbnRzKSxyPXRoaXMsaTtyZXR1cm4gZVswXSYmZVswXS5fbm9kZSYmKGVbMF09ZVswXS5fbm9kZSksZVsxXSYmZVsxXS5fbm9kZSYmKGVbMV09ZVsxXS5fbm9kZSksZS51bnNoaWZ0KHIuX25vZGUpLGk9dC5hcHBseShufHxyLGUpLGkmJihpPWMuc2NydWJWYWwoaSxyKSksdHlwZW9mIGkhPSJ1bmRlZmluZWQifHwoaT1yKSxpfSl9LGMuaW1wb3J0TWV0aG9kPWZ1bmN0aW9uKHQsbixyKXt0eXBlb2Ygbj09InN0cmluZyI/KHI9cnx8bixjLmFkZE1ldGhvZChyLHRbbl0sdCkpOmUuQXJyYXkuZWFjaChuLGZ1bmN0aW9uKGUpe2MuaW1wb3J0TWV0aG9kKHQsZSl9KX0sYy5vbmU9ZnVuY3Rpb24odCl7dmFyIG49bnVsbCxyLGk7aWYodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt0PWMuX2Zyb21TdHJpbmcodCk7aWYoIXQpcmV0dXJuIG51bGx9ZWxzZSBpZih0LmdldERPTU5vZGUpcmV0dXJuIHQ7aWYodC5ub2RlVHlwZXx8ZS5ET00uaXNXaW5kb3codCkpe2k9dC51bmlxdWVJRCYmdC5ub2RlVHlwZSE9PTk/dC51bmlxdWVJRDp0Ll95dWlkLG49Yy5faW5zdGFuY2VzW2ldLHI9bj9uLl9ub2RlOm51bGw7aWYoIW58fHImJnQhPT1yKW49bmV3IGModCksdC5ub2RlVHlwZSE9MTEmJihjLl9pbnN0YW5jZXNbblt1XV09bil9fXJldHVybiBufSxjLkRFRkFVTFRfU0VUVEVSPWZ1bmN0aW9uKHQscil7dmFyIGk9dGhpcy5fc3RhdGVQcm94eSxzO3JldHVybiB0LmluZGV4T2Yobik+LTE/KHM9dCx0PXQuc3BsaXQobiksZS5PYmplY3Quc2V0VmFsdWUoaSx0LHIpKTp0eXBlb2YgaVt0XSE9InVuZGVmaW5lZCImJihpW3RdPXIpLHJ9LGMuREVGQVVMVF9HRVRURVI9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5fc3RhdGVQcm94eSxpO3JldHVybiB0LmluZGV4T2YmJnQuaW5kZXhPZihuKT4tMT9pPWUuT2JqZWN0LmdldFZhbHVlKHIsdC5zcGxpdChuKSk6dHlwZW9mIHJbdF0hPSJ1bmRlZmluZWQiJiYoaT1yW3RdKSxpfSxlLm1peChjLnByb3RvdHlwZSx7REFUQV9QUkVGSVg6ImRhdGEtIix0b1N0cmluZzpmdW5jdGlvbigpe3ZhciBlPXRoaXNbdV0rIjogbm90IGJvdW5kIHRvIGEgbm9kZSIsdD10aGlzLl9ub2RlLG4saSxzO3JldHVybiB0JiYobj10LmF0dHJpYnV0ZXMsaT1uJiZuLmlkP3QuZ2V0QXR0cmlidXRlKCJpZCIpOm51bGwscz1uJiZuLmNsYXNzTmFtZT90LmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik6bnVsbCxlPXRbcl0saSYmKGUrPSIjIitpKSxzJiYoZSs9Ii4iK3MucmVwbGFjZSgiICIsIi4iKSksZSs9IiAiK3RoaXNbdV0pLGV9LGdldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpcy5fZ2V0QXR0cj90PXRoaXMuX2dldEF0dHIoZSk6dD10aGlzLl9nZXQoZSksdD90PWMuc2NydWJWYWwodCx0aGlzKTp0PT09bnVsbCYmKHQ9bnVsbCksdH0sX2dldDpmdW5jdGlvbihlKXt2YXIgdD1jLkFUVFJTW2VdLG47cmV0dXJuIHQmJnQuZ2V0dGVyP249dC5nZXR0ZXIuY2FsbCh0aGlzKTpjLnJlX2FyaWEudGVzdChlKT9uPXRoaXMuX25vZGUuZ2V0QXR0cmlidXRlKGUsMik6bj1jLkRFRkFVTFRfR0VUVEVSLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxufSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1jLkFUVFJTW2VdO3JldHVybiB0aGlzLl9zZXRBdHRyP3RoaXMuX3NldEF0dHIuYXBwbHkodGhpcyxhcmd1bWVudHMpOm4mJm4uc2V0dGVyP24uc2V0dGVyLmNhbGwodGhpcyx0LGUpOmMucmVfYXJpYS50ZXN0KGUpP3RoaXMuX25vZGUuc2V0QXR0cmlidXRlKGUsdCk6Yy5ERUZBVUxUX1NFVFRFUi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpc30sc2V0QXR0cnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3NldEF0dHJzP3RoaXMuX3NldEF0dHJzKHQpOmUuT2JqZWN0LmVhY2godCxmdW5jdGlvbihlLHQpe3RoaXMuc2V0KHQsZSl9LHRoaXMpLHRoaXN9LGdldEF0dHJzOmZ1bmN0aW9uKHQpe3ZhciBuPXt9O3JldHVybiB0aGlzLl9nZXRBdHRycz90aGlzLl9nZXRBdHRycyh0KTplLkFycmF5LmVhY2godCxmdW5jdGlvbihlLHQpe25bZV09dGhpcy5nZXQoZSl9LHRoaXMpLG59LGNvbXBhcmVUbzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiBlJiZlLl9ub2RlJiYoZT1lLl9ub2RlKSx0PT09ZX0saW5Eb2M6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZTtpZih0KXtlPWU/ZS5fbm9kZXx8ZTp0W3NdO2lmKGUuZG9jdW1lbnRFbGVtZW50KXJldHVybiBsLmNvbnRhaW5zKGUuZG9jdW1lbnRFbGVtZW50LHQpfXJldHVybiExfSxnZXRCeUlkOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25vZGUscj1sLmJ5SWQodCxuW3NdKTtyZXR1cm4gciYmbC5jb250YWlucyhuLHIpP3I9ZS5vbmUocik6cj1udWxsLHJ9LGFuY2VzdG9yOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTImJih0eXBlb2Ygbj09InN0cmluZyJ8fHR5cGVvZiBuPT0iZnVuY3Rpb24iKSYmKHI9biksZS5vbmUobC5hbmNlc3Rvcih0aGlzLl9ub2RlLGgodCksbixoKHIpKSl9LGFuY2VzdG9yczpmdW5jdGlvbih0LG4scil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0yJiYodHlwZW9mIG49PSJzdHJpbmcifHx0eXBlb2Ygbj09ImZ1bmN0aW9uIikmJihyPW4pLGUuYWxsKGwuYW5jZXN0b3JzKHRoaXMuX25vZGUsaCh0KSxuLGgocikpKX0scHJldmlvdXM6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5vbmUobC5lbGVtZW50QnlBeGlzKHRoaXMuX25vZGUsInByZXZpb3VzU2libGluZyIsaCh0KSxuKSl9LG5leHQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5vbmUobC5lbGVtZW50QnlBeGlzKHRoaXMuX25vZGUsIm5leHRTaWJsaW5nIixoKHQpLG4pKX0sc2libGluZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWxsKGwuc2libGluZ3ModGhpcy5fbm9kZSxoKHQpKSl9LG9uZTpmdW5jdGlvbih0KXtyZXR1cm4gZS5vbmUoZS5TZWxlY3Rvci5xdWVyeSh0LHRoaXMuX25vZGUsITApKX0sYWxsOmZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0aGlzLl9ub2RlJiYobj1lLmFsbChlLlNlbGVjdG9yLnF1ZXJ5KHQsdGhpcy5fbm9kZSkpLG4uX3F1ZXJ5PXQsbi5fcXVlcnlSb290PXRoaXMuX25vZGUpLG58fGUuYWxsKFtdKX0sdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4gZS5TZWxlY3Rvci50ZXN0KHRoaXMuX25vZGUsdCl9LHJlbW92ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSxlJiZ0aGlzLmRlc3Ryb3koKSx0aGlzfSxyZXBsYWNlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX25vZGU7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9Yy5jcmVhdGUoZSkpLHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYy5nZXRET01Ob2RlKGUpLHQpLHRoaXN9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbih0LG4pe3JldHVybiB0eXBlb2YgdD09InN0cmluZyImJih0PWwuY3JlYXRlKHQpKSxlLm9uZSh0aGlzLl9ub2RlLnJlcGxhY2VDaGlsZChjLmdldERPTU5vZGUodCksYy5nZXRET01Ob2RlKG4pKSl9LGRlc3Ryb3k6ZnVuY3Rpb24odCl7dmFyIG49ZS5jb25maWcuZG9jLnVuaXF1ZUlEPyJ1bmlxdWVJRCI6Il95dWlkIixyO3RoaXMucHVyZ2UoKSx0aGlzLnVucGx1ZyYmdGhpcy51bnBsdWcoKSx0aGlzLmNsZWFyRGF0YSgpLHQmJmUuTm9kZUxpc3QuZWFjaCh0aGlzLmFsbCgiKiIpLGZ1bmN0aW9uKHQpe3I9Yy5faW5zdGFuY2VzW3Rbbl1dLHI/ci5kZXN0cm95KCk6ZS5FdmVudC5wdXJnZUVsZW1lbnQodCl9KSx0aGlzLl9ub2RlPW51bGwsdGhpcy5fc3RhdGVQcm94eT1udWxsLGRlbGV0ZSBjLl9pbnN0YW5jZXNbdGhpcy5feXVpZF19LGludm9rZTpmdW5jdGlvbihlLHQsbixyLGkscyl7dmFyIG89dGhpcy5fbm9kZSx1O3JldHVybiB0JiZ0Ll9ub2RlJiYodD10Ll9ub2RlKSxuJiZuLl9ub2RlJiYobj1uLl9ub2RlKSx1PW9bZV0odCxuLHIsaSxzKSxjLnNjcnViVmFsKHUsdGhpcyl9LHN3YXA6ZS5jb25maWcuZG9jLmRvY3VtZW50RWxlbWVudC5zd2FwTm9kZT9mdW5jdGlvbihlKXt0aGlzLl9ub2RlLnN3YXBOb2RlKGMuZ2V0RE9NTm9kZShlKSl9OmZ1bmN0aW9uKGUpe2U9Yy5nZXRET01Ob2RlKGUpO3ZhciB0PXRoaXMuX25vZGUsbj1lLnBhcmVudE5vZGUscj1lLm5leHRTaWJsaW5nO3JldHVybiByPT09dD9uLmluc2VydEJlZm9yZSh0LGUpOmU9PT10Lm5leHRTaWJsaW5nP24uaW5zZXJ0QmVmb3JlKGUsdCk6KHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZSx0KSxsLmFkZEhUTUwobix0LHIpKSx0aGlzfSxoYXNNZXRob2Q6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZTtyZXR1cm4hKCEodCYmZSBpbiB0JiZ0eXBlb2YgdFtlXSE9InVua25vd24iKXx8dHlwZW9mIHRbZV0hPSJmdW5jdGlvbiImJlN0cmluZyh0W2VdKS5pbmRleE9mKCJmdW5jdGlvbiIpIT09MSl9LGlzRnJhZ21lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoIm5vZGVUeXBlIik9PT0xMX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoImNoaWxkTm9kZXMiKS5yZW1vdmUoKS5kZXN0cm95KCEwKSx0aGlzfSxnZXRET01Ob2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGV9fSwhMCksZS5Ob2RlPWMsZS5vbmU9Yy5vbmU7dmFyIHA9ZnVuY3Rpb24odCl7dmFyIG49W107dCYmKHR5cGVvZiB0PT0ic3RyaW5nIj8odGhpcy5fcXVlcnk9dCx0PWUuU2VsZWN0b3IucXVlcnkodCkpOnQubm9kZVR5cGV8fGwuaXNXaW5kb3codCk/dD1bdF06dC5fbm9kZT90PVt0Ll9ub2RlXToKdFswXSYmdFswXS5fbm9kZT8oZS5BcnJheS5lYWNoKHQsZnVuY3Rpb24oZSl7ZS5fbm9kZSYmbi5wdXNoKGUuX25vZGUpfSksdD1uKTp0PWUuQXJyYXkodCwwLCEwKSksdGhpcy5fbm9kZXM9dHx8W119O3AuTkFNRT0iTm9kZUxpc3QiLHAuZ2V0RE9NTm9kZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX25vZGVzP2UuX25vZGVzOmV9LHAuZWFjaD1mdW5jdGlvbih0LG4scil7dmFyIGk9dC5fbm9kZXM7aSYmaS5sZW5ndGgmJmUuQXJyYXkuZWFjaChpLG4scnx8dCl9LHAuYWRkTWV0aG9kPWZ1bmN0aW9uKHQsbixyKXt0JiZuJiYocC5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXt2YXIgdD1bXSxpPWFyZ3VtZW50cztyZXR1cm4gZS5BcnJheS5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKHMpe3ZhciBvPXMudW5pcXVlSUQmJnMubm9kZVR5cGUhPT05PyJ1bmlxdWVJRCI6Il95dWlkIix1PWUuTm9kZS5faW5zdGFuY2VzW3Nbb11dLGEsZjt1fHwodT1wLl9nZXRUZW1wTm9kZShzKSksYT1yfHx1LGY9bi5hcHBseShhLGkpLGYhPT11bmRlZmluZWQmJmYhPT11JiYodFt0Lmxlbmd0aF09Zil9KSx0Lmxlbmd0aD90OnRoaXN9KX0scC5pbXBvcnRNZXRob2Q9ZnVuY3Rpb24odCxuLHIpe3R5cGVvZiBuPT0ic3RyaW5nIj8ocj1yfHxuLHAuYWRkTWV0aG9kKG4sdFtuXSkpOmUuQXJyYXkuZWFjaChuLGZ1bmN0aW9uKGUpe3AuaW1wb3J0TWV0aG9kKHQsZSl9KX0scC5fZ2V0VGVtcE5vZGU9ZnVuY3Rpb24odCl7dmFyIG49cC5fdGVtcE5vZGU7cmV0dXJuIG58fChuPWUuTm9kZS5jcmVhdGUoIjxkaXY+PC9kaXY+IikscC5fdGVtcE5vZGU9biksbi5fbm9kZT10LG4uX3N0YXRlUHJveHk9dCxufSxlLm1peChwLnByb3RvdHlwZSx7X2ludm9rZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9bj9bXTp0aGlzO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSl7dmFyIHM9aVtlXS5hcHBseShpLHQpO24mJnIucHVzaChzKX0pLHJ9LGl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIGUub25lKCh0aGlzLl9ub2Rlc3x8W10pW3RdKX0sZWFjaDpmdW5jdGlvbih0LG4pe3ZhciByPXRoaXM7cmV0dXJuIGUuQXJyYXkuZWFjaCh0aGlzLl9ub2RlcyxmdW5jdGlvbihpLHMpe3JldHVybiBpPWUub25lKGkpLHQuY2FsbChufHxpLGkscyxyKX0pLHJ9LGJhdGNoOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztyZXR1cm4gZS5BcnJheS5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKGkscyl7dmFyIG89ZS5Ob2RlLl9pbnN0YW5jZXNbaVt1XV07cmV0dXJuIG98fChvPXAuX2dldFRlbXBOb2RlKGkpKSx0LmNhbGwobnx8byxvLHMscil9KSxyfSxzb21lOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztyZXR1cm4gZS5BcnJheS5zb21lKHRoaXMuX25vZGVzLGZ1bmN0aW9uKGkscyl7cmV0dXJuIGk9ZS5vbmUoaSksbj1ufHxpLHQuY2FsbChuLGkscyxyKX0pfSx0b0ZyYWc6ZnVuY3Rpb24oKXtyZXR1cm4gZS5vbmUoZS5ET00uX25sMmZyYWcodGhpcy5fbm9kZXMpKX0saW5kZXhPZjpmdW5jdGlvbih0KXtyZXR1cm4gZS5BcnJheS5pbmRleE9mKHRoaXMuX25vZGVzLGUuTm9kZS5nZXRET01Ob2RlKHQpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiBlLmFsbChlLlNlbGVjdG9yLmZpbHRlcih0aGlzLl9ub2Rlcyx0KSl9LG1vZHVsdXM6ZnVuY3Rpb24odCxuKXtuPW58fDA7dmFyIHI9W107cmV0dXJuIHAuZWFjaCh0aGlzLGZ1bmN0aW9uKGUsaSl7aSV0PT09biYmci5wdXNoKGUpfSksZS5hbGwocil9LG9kZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vZHVsdXMoMiwxKX0sZXZlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vZHVsdXMoMil9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxuPXRoaXMuX25vZGVzLHI9dGhpcy5fcXVlcnksaT10aGlzLl9xdWVyeVJvb3Q7cmV0dXJuIHImJihpfHxuJiZuWzBdJiZuWzBdLm93bmVyRG9jdW1lbnQmJihpPW5bMF0ub3duZXJEb2N1bWVudCksdGhpcy5fbm9kZXM9ZS5TZWxlY3Rvci5xdWVyeShyLGkpKSx0aGlzfSxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzLmxlbmd0aH0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2Rlcy5sZW5ndGg8MX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT0iIix0PXRoaXNbdV0rIjogbm90IGJvdW5kIHRvIGFueSBub2RlcyIsbj10aGlzLl9ub2RlcyxpO3JldHVybiBuJiZuWzBdJiYoaT1uWzBdLGUrPWlbcl0saS5pZCYmKGUrPSIjIitpLmlkKSxpLmNsYXNzTmFtZSYmKGUrPSIuIitpLmNsYXNzTmFtZS5yZXBsYWNlKCIgIiwiLiIpKSxuLmxlbmd0aD4xJiYoZSs9Ii4uLlsiK24ubGVuZ3RoKyIgaXRlbXNdIikpLGV8fHR9LGdldERPTU5vZGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzfX0sITApLHAuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJkZXN0cm95IiwiZW1wdHkiLCJyZW1vdmUiLCJzZXQiXSkscC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBuPVtdLHI9dGhpcy5fbm9kZXMsaT0hMSxzPXAuX2dldFRlbXBOb2RlLG8sdTtyZXR1cm4gclswXSYmKG89ZS5Ob2RlLl9pbnN0YW5jZXNbclswXS5feXVpZF18fHMoclswXSksdT1vLl9nZXQodCksdSYmdS5ub2RlVHlwZSYmKGk9ITApKSxlLkFycmF5LmVhY2gocixmdW5jdGlvbihyKXtvPWUuTm9kZS5faW5zdGFuY2VzW3IuX3l1aWRdLG98fChvPXMocikpLHU9by5fZ2V0KHQpLGl8fCh1PWUuTm9kZS5zY3J1YlZhbCh1LG8pKSxuLnB1c2godSl9KSxpP2UuYWxsKG4pOm59LGUuTm9kZUxpc3Q9cCxlLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHAoZSl9LGUuTm9kZS5hbGw9ZS5hbGw7dmFyIGQ9ZS5Ob2RlTGlzdCx2PUFycmF5LnByb3RvdHlwZSxtPXtjb25jYXQ6MSxwb3A6MCxwdXNoOjAsc2hpZnQ6MCxzbGljZToxLHNwbGljZToxLHVuc2hpZnQ6MH07ZS5PYmplY3QuZWFjaChtLGZ1bmN0aW9uKHQsbil7ZC5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXt2YXIgcj1bXSxpPTAscyxvO3doaWxlKHR5cGVvZiAocz1hcmd1bWVudHNbaSsrXSkhPSJ1bmRlZmluZWQiKXIucHVzaChzLl9ub2RlfHxzLl9ub2Rlc3x8cyk7cmV0dXJuIG89dltuXS5hcHBseSh0aGlzLl9ub2RlcyxyKSx0P289ZS5hbGwobyk6bz1lLk5vZGUuc2NydWJWYWwobyksb319KSxlLkFycmF5LmVhY2goWyJyZW1vdmVDaGlsZCIsImhhc0NoaWxkTm9kZXMiLCJjbG9uZU5vZGUiLCJoYXNBdHRyaWJ1dGUiLCJzY3JvbGxJbnRvVmlldyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZm9jdXMiLCJibHVyIiwic3VibWl0IiwicmVzZXQiLCJzZWxlY3QiLCJjcmVhdGVDYXB0aW9uIl0sZnVuY3Rpb24odCl7ZS5Ob2RlLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLG4scil7dmFyIGk9dGhpcy5pbnZva2UodCxlLG4scik7cmV0dXJuIGl9fSksZS5Ob2RlLnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZTtyZXR1cm4gdCYmdC5yZW1vdmVBdHRyaWJ1dGUoZSwwKSx0aGlzfSxlLk5vZGUuaW1wb3J0TWV0aG9kKGUuRE9NLFsiY29udGFpbnMiLCJzZXRBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJ3cmFwIiwidW53cmFwIiwiZ2VuZXJhdGVJRCJdKSxlLk5vZGVMaXN0LmltcG9ydE1ldGhvZChlLk5vZGUucHJvdG90eXBlLFsiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwidW53cmFwIiwid3JhcCIsImdlbmVyYXRlSUQiXSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1jb3JlIiwic2VsZWN0b3IiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgibm9kZS1iYXNlIixmdW5jdGlvbihlLHQpe3ZhciBuPVsiaGFzQ2xhc3MiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwicmVwbGFjZUNsYXNzIiwidG9nZ2xlQ2xhc3MiXTtlLk5vZGUuaW1wb3J0TWV0aG9kKGUuRE9NLG4pLGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsbik7dmFyIHI9ZS5Ob2RlLGk9ZS5ET007ci5jcmVhdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbiYmbi5fbm9kZSYmKG49bi5fbm9kZSksZS5vbmUoaS5jcmVhdGUodCxuKSl9LGUubWl4KHIucHJvdG90eXBlLHtjcmVhdGU6ci5jcmVhdGUsaW5zZXJ0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2luc2VydChlLHQpLHRoaXN9LF9pbnNlcnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9ub2RlLHI9bnVsbDtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiP3Q9dGhpcy5fbm9kZS5jaGlsZE5vZGVzW3RdOnQmJnQuX25vZGUmJih0PXQuX25vZGUpLGUmJnR5cGVvZiBlIT0ic3RyaW5nIiYmKGU9ZS5fbm9kZXx8ZS5fbm9kZXN8fGUpLHI9aS5hZGRIVE1MKG4sZSx0KSxyfSxwcmVwZW5kOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmluc2VydChlLDApfSxhcHBlbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaW5zZXJ0KGUsbnVsbCl9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUpe3JldHVybiByLnNjcnViVmFsKHRoaXMuX2luc2VydChlKSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LG4pe3JldHVybiBlLk5vZGUuc2NydWJWYWwodGhpcy5faW5zZXJ0KHQsbikpfSxhcHBlbmRUbzpmdW5jdGlvbih0KXtyZXR1cm4gZS5vbmUodCkuYXBwZW5kKHRoaXMpLHRoaXN9LHNldENvbnRlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2luc2VydChlLCJyZXBsYWNlIiksdGhpc30sZ2V0Q29udGVudDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIGUuX25vZGUubm9kZVR5cGU9PT0xMSYmKGU9ZS5jcmVhdGUoIjxkaXYvPiIpLmFwcGVuZChlLmNsb25lTm9kZSghMCkpKSxlLmdldCgiaW5uZXJIVE1MIil9fSksZS5Ob2RlLnByb3RvdHlwZS5zZXRIVE1MPWUuTm9kZS5wcm90b3R5cGUuc2V0Q29udGVudCxlLk5vZGUucHJvdG90eXBlLmdldEhUTUw9ZS5Ob2RlLnByb3RvdHlwZS5nZXRDb250ZW50LGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJhcHBlbmQiLCJpbnNlcnQiLCJhcHBlbmRDaGlsZCIsImluc2VydEJlZm9yZSIsInByZXBlbmQiLCJzZXRDb250ZW50IiwiZ2V0Q29udGVudCIsInNldEhUTUwiLCJnZXRIVE1MIl0pO3ZhciByPWUuTm9kZSxpPWUuRE9NO3IuQVRUUlM9e3RleHQ6e2dldHRlcjpmdW5jdGlvbigpe3JldHVybiBpLmdldFRleHQodGhpcy5fbm9kZSl9LHNldHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gaS5zZXRUZXh0KHRoaXMuX25vZGUsZSksZX19LCJmb3IiOntnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXRBdHRyaWJ1dGUodGhpcy5fbm9kZSwiZm9yIil9LHNldHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gaS5zZXRBdHRyaWJ1dGUodGhpcy5fbm9kZSwiZm9yIixlKSxlfX0sb3B0aW9uczp7Z2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9wdGlvbiIpfX0sY2hpbGRyZW46e2dldHRlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX25vZGUsbj10LmNoaWxkcmVuLHIsaSxzO2lmKCFuKXtyPXQuY2hpbGROb2RlcyxuPVtdO2ZvcihpPTAscz1yLmxlbmd0aDtpPHM7KytpKXJbaV0udGFnTmFtZSYmKG5bbi5sZW5ndGhdPXJbaV0pfXJldHVybiBlLmFsbChuKX19LHZhbHVlOntnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXRWYWx1ZSh0aGlzLl9ub2RlKX0sc2V0dGVyOmZ1bmN0aW9uKGUpe3JldHVybiBpLnNldFZhbHVlKHRoaXMuX25vZGUsZSksZX19fSxlLk5vZGUuaW1wb3J0TWV0aG9kKGUuRE9NLFsic2V0QXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIl0pO3ZhciByPWUuTm9kZSxzPWUuTm9kZUxpc3Q7ci5ET01fRVZFTlRTPXthYm9ydDoxLGJlZm9yZXVubG9hZDoxLGJsdXI6MSxjaGFuZ2U6MSxjbGljazoxLGNsb3NlOjEsY29tbWFuZDoxLGNvbnRleHRtZW51OjEsY29weToxLGN1dDoxLGRibGNsaWNrOjEsRE9NTW91c2VTY3JvbGw6MSxkcmFnOjEsZHJhZ3N0YXJ0OjEsZHJhZ2VudGVyOjEsZHJhZ292ZXI6MSxkcmFnbGVhdmU6MSxkcmFnZW5kOjEsZHJvcDoxLGVycm9yOjEsZm9jdXM6MSxrZXk6MSxrZXlkb3duOjEsa2V5cHJlc3M6MSxrZXl1cDoxLGxvYWQ6MSxtZXNzYWdlOjEsbW91c2Vkb3duOjEsbW91c2VlbnRlcjoxLG1vdXNlbGVhdmU6MSxtb3VzZW1vdmU6MSxtb3VzZW11bHRpd2hlZWw6MSxtb3VzZW91dDoxLG1vdXNlb3ZlcjoxLG1vdXNldXA6MSxtb3VzZXdoZWVsOjEsb3JpZW50YXRpb25jaGFuZ2U6MSxwYXN0ZToxLHJlc2V0OjEscmVzaXplOjEsc2VsZWN0OjEsc2VsZWN0c3RhcnQ6MSxzdWJtaXQ6MSxzY3JvbGw6MSx0ZXh0SW5wdXQ6MSx1bmxvYWQ6MSxpbnZhbGlkOjF9LGUubWl4KHIuRE9NX0VWRU5UUyxlLkVudi5ldnQucGx1Z2lucyksZS5hdWdtZW50KHIsZS5FdmVudFRhcmdldCksZS5taXgoci5wcm90b3R5cGUse3B1cmdlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuRXZlbnQucHVyZ2VFbGVtZW50KHRoaXMuX25vZGUsdCxuKSx0aGlzfX0pLGUubWl4KGUuTm9kZUxpc3QucHJvdG90eXBlLHtfcHJlcEV2dEFyZ3M6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUuQXJyYXkoYXJndW1lbnRzLDAsITApO3JldHVybiBpLmxlbmd0aDwyP2lbMl09dGhpcy5fbm9kZXM6aS5zcGxpY2UoMiwwLHRoaXMuX25vZGVzKSxpWzNdPXJ8fHRoaXMsaX0sb246ZnVuY3Rpb24odCxuLHIpe3JldHVybiBlLm9uLmFwcGx5KGUsdGhpcy5fcHJlcEV2dEFyZ3MuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sb25jZTpmdW5jdGlvbih0LG4scil7cmV0dXJuIGUub25jZS5hcHBseShlLHRoaXMuX3ByZXBFdnRBcmdzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGFmdGVyOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gZS5hZnRlci5hcHBseShlLHRoaXMuX3ByZXBFdnRBcmdzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LG9uY2VBZnRlcjpmdW5jdGlvbih0LG4scil7cmV0dXJuIGUub25jZUFmdGVyLmFwcGx5KGUsdGhpcy5fcHJlcEV2dEFyZ3MuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19KSxzLmltcG9ydE1ldGhvZChlLk5vZGUucHJvdG90eXBlLFsiZGV0YWNoIiwiZGV0YWNoQWxsIl0pLGUubWl4KGUuTm9kZS5BVFRSUyx7b2Zmc2V0SGVpZ2h0OntzZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLnNldEhlaWdodCh0aGlzLl9ub2RlLHQpLHR9LGdldHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlLm9mZnNldEhlaWdodH19LG9mZnNldFdpZHRoOntzZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLnNldFdpZHRoKHRoaXMuX25vZGUsdCksdH0sZ2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGUub2Zmc2V0V2lkdGh9fX0pLGUubWl4KGUuTm9kZS5wcm90b3R5cGUse3NpemVUbzpmdW5jdGlvbih0LG4pe3ZhciByO2FyZ3VtZW50cy5sZW5ndGg8MiYmKHI9ZS5vbmUodCksdD1yLmdldCgib2Zmc2V0V2lkdGgiKSxuPXIuZ2V0KCJvZmZzZXRIZWlnaHQiKSksdGhpcy5zZXRBdHRycyh7b2Zmc2V0V2lkdGg6dCxvZmZzZXRIZWlnaHQ6bn0pfX0pLGUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnQuaGFzQXR0cmlidXRlfHwoZS5Ob2RlLnByb3RvdHlwZS5oYXNBdHRyaWJ1dGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0idmFsdWUiJiZ0aGlzLmdldCgidmFsdWUiKSE9PSIiPyEwOiEhdGhpcy5fbm9kZS5hdHRyaWJ1dGVzW2VdJiYhIXRoaXMuX25vZGUuYXR0cmlidXRlc1tlXS5zcGVjaWZpZWR9KSxlLk5vZGUucHJvdG90eXBlLmZvY3VzPWZ1bmN0aW9uKCl7dHJ5e3RoaXMuX25vZGUuZm9jdXMoKX1jYXRjaChlKXt9cmV0dXJuIHRoaXN9LGUuTm9kZS5BVFRSUy50eXBlPXtzZXR0ZXI6ZnVuY3Rpb24oZSl7aWYoZT09PSJoaWRkZW4iKXRyeXt0aGlzLl9ub2RlLnR5cGU9ImhpZGRlbiJ9Y2F0Y2godCl7dGhpcy5fbm9kZS5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLl9pbnB1dFR5cGU9ImhpZGRlbiJ9ZWxzZSB0cnl7dGhpcy5fbm9kZS50eXBlPWV9Y2F0Y2godCl7fXJldHVybiBlfSxnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5wdXRUeXBlfHx0aGlzLl9ub2RlLnR5cGV9LF9ieXBhc3NQcm94eTohMH0sZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbGVtZW50cy5ub2RlVHlwZSYmKGUuTm9kZS5BVFRSUy5lbGVtZW50cz17Z2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWxsKCJpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbiwgc2VsZWN0Iil9fSksZS5taXgoZS5Ob2RlLnByb3RvdHlwZSx7X2luaXREYXRhOmZ1bmN0aW9uKCl7Il9kYXRhImluIHRoaXN8fCh0aGlzLl9kYXRhPXt9KX0sZ2V0RGF0YTpmdW5jdGlvbih0KXt0aGlzLl9pbml0RGF0YSgpO3ZhciBuPXRoaXMuX2RhdGEscj1uO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QgaW4gbj9yPW5bdF06cj10aGlzLl9nZXREYXRhQXR0cmlidXRlKHQpOnR5cGVvZiBuPT0ib2JqZWN0IiYmbiE9PW51bGwmJihyPXt9LGUuT2JqZWN0LmVhY2gobixmdW5jdGlvbihlLHQpe3JbdF09ZX0pLHI9dGhpcy5fZ2V0RGF0YUF0dHJpYnV0ZXMocikpLHJ9LF9nZXREYXRhQXR0cmlidXRlczpmdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PTAsbj10aGlzLl9ub2RlLmF0dHJpYnV0ZXMscj1uLmxlbmd0aCxpPXRoaXMuREFUQV9QUkVGSVgscz1pLmxlbmd0aCxvO3doaWxlKHQ8cilvPW5bdF0ubmFtZSxvLmluZGV4T2YoaSk9PT0wJiYobz1vLnN1YnN0cihzKSxvIGluIGV8fChlW29dPXRoaXMuX2dldERhdGFBdHRyaWJ1dGUobykpKSx0Kz0xO3JldHVybiBlfSxfZ2V0RGF0YUF0dHJpYnV0ZTpmdW5jdGlvbihlKXtlPXRoaXMuREFUQV9QUkVGSVgrZTt2YXIgdD10aGlzLl9ub2RlLG49dC5hdHRyaWJ1dGVzLHI9biYmbltlXSYmbltlXS52YWx1ZTtyZXR1cm4gcn0sc2V0RGF0YTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9pbml0RGF0YSgpLGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLl9kYXRhW2VdPXQ6dGhpcy5fZGF0YT1lLHRoaXN9LGNsZWFyRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4iX2RhdGEiaW4gdGhpcyYmKHR5cGVvZiBlIT0idW5kZWZpbmVkIj9kZWxldGUgdGhpcy5fZGF0YVtlXTpkZWxldGUgdGhpcy5fZGF0YSksdGhpc319KSxlLm1peChlLk5vZGVMaXN0LnByb3RvdHlwZSx7Z2V0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoP1tlXTpbXTtyZXR1cm4gdGhpcy5faW52b2tlKCJnZXREYXRhIix0LCEwKX0sc2V0RGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MT9bZSx0XTpbZV07cmV0dXJuIHRoaXMuX2ludm9rZSgic2V0RGF0YSIsbil9LGNsZWFyRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoP1tlXTpbXTtyZXR1cm4gdGhpcy5faW52b2tlKCJjbGVhckRhdGEiLFtlXSl9fSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImV2ZW50LWJhc2UiLCJub2RlLWNvcmUiLCJkb20tYmFzZSIsImRvbS1zdHlsZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1iYXNlIixmdW5jdGlvbihlLHQpe2UucHVibGlzaCgiZG9tcmVhZHkiLHtmaXJlT25jZTohMCxhc3luYzohMH0pLFlVSS5FbnYuRE9NUmVhZHk/ZS5maXJlKCJkb21yZWFkeSIpOmUuRG8uYmVmb3JlKGZ1bmN0aW9uKCl7ZS5maXJlKCJkb21yZWFkeSIpfSxZVUkuRW52LCJfcmVhZHkiKTt2YXIgbj1lLlVBLHI9e30saT17NjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyNzY6MzMsNjMyNzc6MzQsMjU6OSw2MzI3Mjo0Niw2MzI3MzozNiw2MzI3NTozNX0scz1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gdDt0cnl7dCYmMz09dC5ub2RlVHlwZSYmKHQ9dC5wYXJlbnROb2RlKX1jYXRjaChuKXtyZXR1cm4gbnVsbH1yZXR1cm4gZS5vbmUodCl9LG89ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX2V2ZW50PWUsdGhpcy5fY3VycmVudFRhcmdldD10LHRoaXMuX3dyYXBwZXI9bnx8cix0aGlzLmluaXQoKX07ZS5leHRlbmQobyxPYmplY3Qse2luaXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9ldmVudCx0PXRoaXMuX3dyYXBwZXIub3ZlcnJpZGVzLHI9ZS5wYWdlWCxvPWUucGFnZVksdSxhPXRoaXMuX2N1cnJlbnRUYXJnZXQ7dGhpcy5hbHRLZXk9ZS5hbHRLZXksdGhpcy5jdHJsS2V5PWUuY3RybEtleSx0aGlzLm1ldGFLZXk9ZS5tZXRhS2V5LHRoaXMuc2hpZnRLZXk9ZS5zaGlmdEtleSx0aGlzLnR5cGU9dCYmdC50eXBlfHxlLnR5cGUsdGhpcy5jbGllbnRYPWUuY2xpZW50WCx0aGlzLmNsaWVudFk9ZS5jbGllbnRZLHRoaXMucGFnZVg9cix0aGlzLnBhZ2VZPW8sdT1lLmtleUNvZGV8fGUuY2hhckNvZGUsbi53ZWJraXQmJnUgaW4gaSYmKHU9aVt1XSksdGhpcy5rZXlDb2RlPXUsdGhpcy5jaGFyQ29kZT11LHRoaXMud2hpY2g9ZS53aGljaHx8ZS5jaGFyQ29kZXx8dSx0aGlzLmJ1dHRvbj10aGlzLndoaWNoLHRoaXMudGFyZ2V0PXMoZS50YXJnZXQpLHRoaXMuY3VycmVudFRhcmdldD1zKGEpLHRoaXMucmVsYXRlZFRhcmdldD1zKGUucmVsYXRlZFRhcmdldCk7aWYoZS50eXBlPT0ibW91c2V3aGVlbCJ8fGUudHlwZT09IkRPTU1vdXNlU2Nyb2xsIil0aGlzLndoZWVsRGVsdGE9ZS5kZXRhaWw/ZS5kZXRhaWwqLTE6TWF0aC5yb3VuZChlLndoZWVsRGVsdGEvODApfHwoZS53aGVlbERlbHRhPDA/LTE6MSk7dGhpcy5fdG91Y2gmJnRoaXMuX3RvdWNoKGUsYSx0aGlzLl93cmFwcGVyKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fd3JhcHBlci5zdG9wcGVkPTEsdGhpcy5zdG9wcGVkPTF9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2V2ZW50O2Uuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uP2Uuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk6dGhpcy5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl93cmFwcGVyLnN0b3BwZWQ9Mix0aGlzLnN0b3BwZWQ9Mn0scHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZXZlbnQ7dC5wcmV2ZW50RGVmYXVsdCgpLGUmJih0LnJldHVyblZhbHVlPWUpLHRoaXMuX3dyYXBwZXIucHJldmVudGVkPTEsdGhpcy5wcmV2ZW50ZWQ9MX0saGFsdDpmdW5jdGlvbihlKXtlP3RoaXMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk6dGhpcy5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnByZXZlbnREZWZhdWx0KCl9fSksby5yZXNvbHZlPXMsZS5ET00yRXZlbnRGYWNhZGU9byxlLkRPTUV2ZW50RmFjYWRlPW8sZnVuY3Rpb24oKXtlLkVudi5ldnQuZG9tX3dyYXBwZXJzPXt9LGUuRW52LmV2dC5kb21fbWFwPXt9O3ZhciB0PWUuRW52LmV2dCxuPWUuY29uZmlnLHI9bi53aW4saT1ZVUkuRW52LmFkZCxzPVlVSS5FbnYucmVtb3ZlLG89ZnVuY3Rpb24oKXtZVUkuRW52LndpbmRvd0xvYWRlZD0hMCxlLkV2ZW50Ll9sb2FkKCkscyhyLCJsb2FkIixvKX0sdT1mdW5jdGlvbigpe2UuRXZlbnQuX3VubG9hZCgpfSxhPSJkb21yZWFkeSIsZj0ifnl1aXwyfGNvbXBhdH4iLGw9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0JiZ0eXBlb2YgdCE9InN0cmluZyImJmUuTGFuZy5pc051bWJlcih0Lmxlbmd0aCkmJiF0LnRhZ05hbWUmJiFlLkRPTS5pc1dpbmRvdyh0KX1jYXRjaChuKXtyZXR1cm4hMX19LGM9ZS5DdXN0b21FdmVudC5wcm90b3R5cGUuX2RlbGV0ZSxoPWZ1bmN0aW9uKHQpe3ZhciBuPWMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzLmhhc1N1YnMoKXx8ZS5FdmVudC5fY2xlYW4odGhpcyksbn0scD1mdW5jdGlvbigpe3ZhciBuPSExLG89MCxjPVtdLGQ9dC5kb21fd3JhcHBlcnMsdj1udWxsLG09dC5kb21fbWFwO3JldHVybntQT0xMX1JFVFJZUzoxZTMsUE9MTF9JTlRFUlZBTDo0MCxsYXN0RXJyb3I6bnVsbCxfaW50ZXJ2YWw6bnVsbCxfZHJpOm51bGwsRE9NUmVhZHk6ITEsc3RhcnRJbnRlcnZhbDpmdW5jdGlvbigpe3AuX2ludGVydmFsfHwocC5faW50ZXJ2YWw9c2V0SW50ZXJ2YWwocC5fcG9sbCxwLlBPTExfSU5URVJWQUwpKX0sb25BdmFpbGFibGU6ZnVuY3Rpb24odCxuLHIsaSxzLHUpe3ZhciBhPWUuQXJyYXkodCksZixsO2ZvcihmPTA7ZjxhLmxlbmd0aDtmKz0xKWMucHVzaCh7aWQ6YVtmXSxmbjpuLG9iajpyLG92ZXJyaWRlOmksY2hlY2tSZWFkeTpzLGNvbXBhdDp1fSk7cmV0dXJuIG89dGhpcy5QT0xMX1JFVFJZUyxzZXRUaW1lb3V0KHAuX3BvbGwsMCksbD1uZXcgZS5FdmVudEhhbmRsZSh7X2RlbGV0ZTpmdW5jdGlvbigpe2lmKGwuaGFuZGxlKXtsLmhhbmRsZS5kZXRhY2goKTtyZXR1cm59dmFyIGUsdDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWZvcih0PTA7dDxjLmxlbmd0aDt0KyspYVtlXT09PWNbdF0uaWQmJmMuc3BsaWNlKHQsMSl9fSksbH0sb25Db250ZW50UmVhZHk6ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4gcC5vbkF2YWlsYWJsZShlLHQsbixyLCEwLGkpfSxhdHRhY2g6ZnVuY3Rpb24odCxuLHIsaSl7cmV0dXJuIHAuX2F0dGFjaChlLkFycmF5KGFyZ3VtZW50cywwLCEwKSl9LF9jcmVhdGVXcmFwcGVyOmZ1bmN0aW9uKHQsbixzLG8sdSl7dmFyIGEsZj1lLnN0YW1wKHQpLGw9ImV2ZW50OiIrZituO3JldHVybiExPT09dSYmKGwrPSJuYXRpdmUiKSxzJiYobCs9ImNhcHR1cmUiKSxhPWRbbF0sYXx8KGE9ZS5wdWJsaXNoKGwse3NpbGVudDohMCxidWJibGVzOiExLGVtaXRGYWNhZGU6ITEsY29udGV4dEZuOmZ1bmN0aW9uKCl7cmV0dXJuIG8/YS5lbDooYS5ub2RlUmVmPWEubm9kZVJlZnx8ZS5vbmUoYS5lbCksYS5ub2RlUmVmKX19KSxhLm92ZXJyaWRlcz17fSxhLmVsPXQsYS5rZXk9bCxhLmRvbWtleT1mLGEudHlwZT1uLGEuZm49ZnVuY3Rpb24oZSl7YS5maXJlKHAuZ2V0RXZlbnQoZSx0LG98fCExPT09dSkpfSxhLmNhcHR1cmU9cyx0PT1yJiZuPT0ibG9hZCImJihhLmZpcmVPbmNlPSEwLHY9bCksYS5fZGVsZXRlPWgsZFtsXT1hLG1bZl09bVtmXXx8e30sbVtmXVtsXT1hLGkodCxuLGEuZm4scykpLGF9LF9hdHRhY2g6ZnVuY3Rpb24odCxuKXt2YXIgaSxzLG8sdSxhLGM9ITEsaCxkPXRbMF0sdj10WzFdLG09dFsyXXx8cixnPW4mJm4uZmFjYWRlLHk9biYmbi5jYXB0dXJlLGI9biYmbi5vdmVycmlkZXM7dFt0Lmxlbmd0aC0xXT09PWYmJihpPSEwKTtpZighdnx8IXYuY2FsbClyZXR1cm4hMTtpZihsKG0pKXJldHVybiBzPVtdLGUuZWFjaChtLGZ1bmN0aW9uKGUscil7dFsyXT1lLHMucHVzaChwLl9hdHRhY2godC5zbGljZSgpLG4pKX0pLG5ldyBlLkV2ZW50SGFuZGxlKHMpO2lmKGUuTGFuZy5pc1N0cmluZyhtKSl7aWYoaSlvPWUuRE9NLmJ5SWQobSk7ZWxzZXtvPWUuU2VsZWN0b3IucXVlcnkobSk7c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDA6bz1udWxsO2JyZWFrO2Nhc2UgMTpvPW9bMF07YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdFsyXT1vLHAuX2F0dGFjaCh0LG4pfX1pZighbylyZXR1cm4gaD1wLm9uQXZhaWxhYmxlKG0sZnVuY3Rpb24oKXtoLmhhbmRsZT1wLl9hdHRhY2godCxuKX0scCwhMCwhMSxpKSxoO209b31yZXR1cm4gbT8oZS5Ob2RlJiZlLmluc3RhbmNlT2YobSxlLk5vZGUpJiYobT1lLk5vZGUuZ2V0RE9NTm9kZShtKSksdT1wLl9jcmVhdGVXcmFwcGVyKG0sZCx5LGksZyksYiYmZS5taXgodS5vdmVycmlkZXMsYiksbT09ciYmZD09ImxvYWQiJiZZVUkuRW52LndpbmRvd0xvYWRlZCYmKGM9ITApLGkmJnQucG9wKCksYT10WzNdLGg9dS5fb24odixhLHQubGVuZ3RoPjQ/dC5zbGljZSg0KTpudWxsKSxjJiZ1LmZpcmUoKSxoKTohMX0sZGV0YWNoOmZ1bmN0aW9uKHQsbixyLGkpe3ZhciBzPWUuQXJyYXkoYXJndW1lbnRzLDAsITApLG8sdSxhLGMsaCx2O3Nbcy5sZW5ndGgtMV09PT1mJiYobz0hMCk7aWYodCYmdC5kZXRhY2gpcmV0dXJuIHQuZGV0YWNoKCk7dHlwZW9mIHI9PSJzdHJpbmciJiYobz9yPWUuRE9NLmJ5SWQocik6KHI9ZS5TZWxlY3Rvci5xdWVyeShyKSx1PXIubGVuZ3RoLHU8MT9yPW51bGw6dT09MSYmKHI9clswXSkpKTtpZighcilyZXR1cm4hMTtpZihyLmRldGFjaClyZXR1cm4gcy5zcGxpY2UoMiwxKSxyLmRldGFjaC5hcHBseShyLHMpO2lmKGwocikpe2E9ITA7Zm9yKGM9MCx1PXIubGVuZ3RoO2M8dTsrK2Mpc1syXT1yW2NdLGE9ZS5FdmVudC5kZXRhY2guYXBwbHkoZS5FdmVudCxzKSYmYTtyZXR1cm4gYX1yZXR1cm4hdHx8IW58fCFuLmNhbGw/cC5wdXJnZUVsZW1lbnQociwhMSx0KTooaD0iZXZlbnQ6IitlLnN0YW1wKHIpK3Qsdj1kW2hdLHY/di5kZXRhY2gobik6ITEpfSxnZXRFdmVudDpmdW5jdGlvbih0LG4saSl7dmFyIHM9dHx8ci5ldmVudDtyZXR1cm4gaT9zOm5ldyBlLkRPTUV2ZW50RmFjYWRlKHMsbixkWyJldmVudDoiK2Uuc3RhbXAobikrdC50eXBlXSl9LGdlbmVyYXRlSWQ6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLmdlbmVyYXRlSUQodCl9LF9pc1ZhbGlkQ29sbGVjdGlvbjpsLF9sb2FkOmZ1bmN0aW9uKHQpe258fChuPSEwLGUuZmlyZSYmZS5maXJlKGEpLHAuX3BvbGwoKSl9LF9wb2xsOmZ1bmN0aW9uKCl7aWYocC5sb2NrZWQpcmV0dXJuO2lmKGUuVUEuaWUmJiFZVUkuRW52LkRPTVJlYWR5KXtwLnN0YXJ0SW50ZXJ2YWwoKTtyZXR1cm59cC5sb2NrZWQ9ITA7dmFyIHQscixpLHMsdSxhLGY9IW47Znx8KGY9bz4wKSx1PVtdLGE9ZnVuY3Rpb24odCxuKXt2YXIgcixpPW4ub3ZlcnJpZGU7dHJ5e24uY29tcGF0PyhuLm92ZXJyaWRlP2k9PT0hMD9yPW4ub2JqOnI9aTpyPXQsbi5mbi5jYWxsKHIsbi5vYmopKToocj1uLm9ianx8ZS5vbmUodCksbi5mbi5hcHBseShyLGUuTGFuZy5pc0FycmF5KGkpP2k6W10pKX1jYXRjaChzKXt9fTtmb3IodD0wLHI9Yy5sZW5ndGg7dDxyOysrdClpPWNbdF0saSYmIWkuY2hlY2tSZWFkeSYmKHM9aS5jb21wYXQ/ZS5ET00uYnlJZChpLmlkKTplLlNlbGVjdG9yLnF1ZXJ5KGkuaWQsbnVsbCwhMCkscz8oYShzLGkpLGNbdF09bnVsbCk6dS5wdXNoKGkpKTtmb3IodD0wLHI9Yy5sZW5ndGg7dDxyOysrdCl7aT1jW3RdO2lmKGkmJmkuY2hlY2tSZWFkeSl7cz1pLmNvbXBhdD9lLkRPTS5ieUlkKGkuaWQpOmUuU2VsZWN0b3IucXVlcnkoaS5pZCxudWxsLCEwKTtpZihzKXtpZihufHxzLmdldCYmcy5nZXQoIm5leHRTaWJsaW5nIil8fHMubmV4dFNpYmxpbmcpYShzLGkpLGNbdF09bnVsbH1lbHNlIHUucHVzaChpKX19bz11Lmxlbmd0aD09PTA/MDpvLTEsZj9wLnN0YXJ0SW50ZXJ2YWwoKTooY2xlYXJJbnRlcnZhbChwLl9pbnRlcnZhbCkscC5faW50ZXJ2YWw9bnVsbCkscC5sb2NrZWQ9ITE7cmV0dXJufSxwdXJnZUVsZW1lbnQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUuTGFuZy5pc1N0cmluZyh0KT9lLlNlbGVjdG9yLnF1ZXJ5KHQsbnVsbCwhMCk6dCxzPXAuZ2V0TGlzdGVuZXJzKGksciksbyx1LGEsZjtpZihuJiZpKXtzPXN8fFtdLGE9ZS5TZWxlY3Rvci5xdWVyeSgiKiIsaSksdT1hLmxlbmd0aDtmb3Iobz0wO288dTsrK28pZj1wLmdldExpc3RlbmVycyhhW29dLHIpLGYmJihzPXMuY29uY2F0KGYpKX1pZihzKWZvcihvPTAsdT1zLmxlbmd0aDtvPHU7KytvKXNbb10uZGV0YWNoQWxsKCl9CixfY2xlYW46ZnVuY3Rpb24odCl7dmFyIG49dC5rZXkscj10LmRvbWtleTtzKHQuZWwsdC50eXBlLHQuZm4sdC5jYXB0dXJlKSxkZWxldGUgZFtuXSxkZWxldGUgZS5feXVpZXZ0LmV2ZW50c1tuXSxtW3JdJiYoZGVsZXRlIG1bcl1bbl0sZS5PYmplY3Quc2l6ZShtW3JdKXx8ZGVsZXRlIG1bcl0pfSxnZXRMaXN0ZW5lcnM6ZnVuY3Rpb24obixyKXt2YXIgaT1lLnN0YW1wKG4sITApLHM9bVtpXSxvPVtdLHU9cj8iZXZlbnQ6IitpK3I6bnVsbCxhPXQucGx1Z2lucztyZXR1cm4gcz8odT8oYVtyXSYmYVtyXS5ldmVudERlZiYmKHUrPSJfc3ludGgiKSxzW3VdJiZvLnB1c2goc1t1XSksdSs9Im5hdGl2ZSIsc1t1XSYmby5wdXNoKHNbdV0pKTplLmVhY2gocyxmdW5jdGlvbihlLHQpe28ucHVzaChlKX0pLG8ubGVuZ3RoP286bnVsbCk6bnVsbH0sX3VubG9hZDpmdW5jdGlvbih0KXtlLmVhY2goZCxmdW5jdGlvbihlLG4pe2UudHlwZT09InVubG9hZCImJmUuZmlyZSh0KSxlLmRldGFjaEFsbCgpfSkscyhyLCJ1bmxvYWQiLHUpfSxuYXRpdmVBZGQ6aSxuYXRpdmVSZW1vdmU6c319KCk7ZS5FdmVudD1wLG4uaW5qZWN0ZWR8fFlVSS5FbnYud2luZG93TG9hZGVkP28oKTppKHIsImxvYWQiLG8pO2lmKGUuVUEuaWUpe2Uub24oYSxwLl9wb2xsKTtpZihlLlVBLmllPDcpdHJ5e2kociwidW5sb2FkIix1KX1jYXRjaChkKXt9fXAuQ3VzdG9tPWUuQ3VzdG9tRXZlbnQscC5TdWJzY3JpYmVyPWUuU3Vic2NyaWJlcixwLlRhcmdldD1lLkV2ZW50VGFyZ2V0LHAuSGFuZGxlPWUuRXZlbnRIYW5kbGUscC5GYWNhZGU9ZS5FdmVudEZhY2FkZSxwLl9wb2xsKCl9KCksZS5FbnYuZXZ0LnBsdWdpbnMuYXZhaWxhYmxlPXtvbjpmdW5jdGlvbih0LG4scixpKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjQ/ZS5BcnJheShhcmd1bWVudHMsNCwhMCk6bnVsbDtyZXR1cm4gZS5FdmVudC5vbkF2YWlsYWJsZS5jYWxsKGUuRXZlbnQscixuLGkscyl9fSxlLkVudi5ldnQucGx1Z2lucy5jb250ZW50cmVhZHk9e29uOmZ1bmN0aW9uKHQsbixyLGkpe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGg+ND9lLkFycmF5KGFyZ3VtZW50cyw0LCEwKTpudWxsO3JldHVybiBlLkV2ZW50Lm9uQ29udGVudFJlYWR5LmNhbGwoZS5FdmVudCxyLG4saSxzKX19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgooZnVuY3Rpb24oKXt2YXIgZSx0PVlVSS5FbnYsbj1ZVUkuY29uZmlnLHI9bi5kb2MsaT1yJiZyLmRvY3VtZW50RWxlbWVudCxzPSJvbnJlYWR5c3RhdGVjaGFuZ2UiLG89bi5wb2xsSW50ZXJ2YWx8fDQwO2kuZG9TY3JvbGwmJiF0Ll9pZXJlYWR5JiYodC5faWVyZWFkeT1mdW5jdGlvbigpe3QuX3JlYWR5KCl9LAovKiEgRE9NUmVhZHk6IGJhc2VkIG9uIHdvcmsgYnk6IERlYW4gRWR3YXJkcy9Kb2huIFJlc2lnL01hdHRoaWFzIE1pbGxlci9EaWVnbyBQZXJpbmkgKi8Kc2VsZiE9PXNlbGYudG9wPyhlPWZ1bmN0aW9uKCl7ci5yZWFkeVN0YXRlPT0iY29tcGxldGUiJiYodC5yZW1vdmUocixzLGUpLHQuaWVyZWFkeSgpKX0sdC5hZGQocixzLGUpKTp0Ll9kcmk9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0cnl7aS5kb1Njcm9sbCgibGVmdCIpLGNsZWFySW50ZXJ2YWwodC5fZHJpKSx0Ll9kcmk9bnVsbCx0Ll9pZXJlYWR5KCl9Y2F0Y2goZSl7fX0sbykpfSkoKSxZVUkuYWRkKCJldmVudC1iYXNlLWllIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtlLkRPTTJFdmVudEZhY2FkZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcih0KXt2YXIgbj1lLmNvbmZpZy5kb2MuY3JlYXRlRXZlbnRPYmplY3QodCksaT1yLnByb3RvdHlwZTtyZXR1cm4gbi5oYXNPd25Qcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiEwfSxuLmluaXQ9aS5pbml0LG4uaGFsdD1pLmhhbHQsbi5wcmV2ZW50RGVmYXVsdD1pLnByZXZlbnREZWZhdWx0LG4uc3RvcFByb3BhZ2F0aW9uPWkuc3RvcFByb3BhZ2F0aW9uLG4uc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uPWkuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uLGUuRE9NMkV2ZW50RmFjYWRlLmFwcGx5KG4sYXJndW1lbnRzKSxufXZhciBpPWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmltcGxlbWVudGF0aW9uLHM9ZS5jb25maWcubGF6eUV2ZW50RmFjYWRlLG89ezA6MSw0OjIsMjozfSx1PXttb3VzZW91dDoidG9FbGVtZW50Iixtb3VzZW92ZXI6ImZyb21FbGVtZW50In0sYT1lLkRPTTJFdmVudEZhY2FkZS5yZXNvbHZlLGY9e2luaXQ6ZnVuY3Rpb24oKXtuLnN1cGVyY2xhc3MuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHQ9dGhpcy5fZXZlbnQscixpLHMsdSxmLGw7dGhpcy50YXJnZXQ9YSh0LnNyY0VsZW1lbnQpLCJjbGllbnRYImluIHQmJiFyJiYwIT09ciYmKHI9dC5jbGllbnRYLGk9dC5jbGllbnRZLHM9ZS5jb25maWcuZG9jLHU9cy5ib2R5LGY9cy5kb2N1bWVudEVsZW1lbnQscis9Zi5zY3JvbGxMZWZ0fHx1JiZ1LnNjcm9sbExlZnR8fDAsaSs9Zi5zY3JvbGxUb3B8fHUmJnUuc2Nyb2xsVG9wfHwwLHRoaXMucGFnZVg9cix0aGlzLnBhZ2VZPWkpLHQudHlwZT09Im1vdXNlb3V0Ij9sPXQudG9FbGVtZW50OnQudHlwZT09Im1vdXNlb3ZlciImJihsPXQuZnJvbUVsZW1lbnQpLHRoaXMucmVsYXRlZFRhcmdldD1hKGx8fHQucmVsYXRlZFRhcmdldCksdGhpcy53aGljaD10aGlzLmJ1dHRvbj10LmtleUNvZGV8fG9bdC5idXR0b25dfHx0LmJ1dHRvbn0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQuY2FuY2VsQnViYmxlPSEwLHRoaXMuX3dyYXBwZXIuc3RvcHBlZD0xLHRoaXMuc3RvcHBlZD0xfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX3dyYXBwZXIuc3RvcHBlZD0yLHRoaXMuc3RvcHBlZD0yfSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbihlKXt0aGlzLl9ldmVudC5yZXR1cm5WYWx1ZT1lfHwhMSx0aGlzLl93cmFwcGVyLnByZXZlbnRlZD0xLHRoaXMucHJldmVudGVkPTF9fTtlLmV4dGVuZChuLGUuRE9NMkV2ZW50RmFjYWRlLGYpLGUuZXh0ZW5kKHIsZS5ET00yRXZlbnRGYWNhZGUsZiksci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2V2ZW50LHQ9dGhpcy5fd3JhcHBlci5vdmVycmlkZXMsbj1yLl9kZWZpbmUsaT1yLl9sYXp5UHJvcGVydGllcyxzO3RoaXMuYWx0S2V5PWUuYWx0S2V5LHRoaXMuY3RybEtleT1lLmN0cmxLZXksdGhpcy5tZXRhS2V5PWUubWV0YUtleSx0aGlzLnNoaWZ0S2V5PWUuc2hpZnRLZXksdGhpcy50eXBlPXQmJnQudHlwZXx8ZS50eXBlLHRoaXMuY2xpZW50WD1lLmNsaWVudFgsdGhpcy5jbGllbnRZPWUuY2xpZW50WSx0aGlzLmtleUNvZGU9dGhpcy5jaGFyQ29kZT1lLmtleUNvZGUsdGhpcy53aGljaD10aGlzLmJ1dHRvbj1lLmtleUNvZGV8fG9bZS5idXR0b25dfHxlLmJ1dHRvbjtmb3IocyBpbiBpKWkuaGFzT3duUHJvcGVydHkocykmJm4odGhpcyxzLGlbc10pO3RoaXMuX3RvdWNoJiZ0aGlzLl90b3VjaChlLHRoaXMuX2N1cnJlbnRUYXJnZXQsdGhpcy5fd3JhcHBlcil9LHIuX2xhenlQcm9wZXJ0aWVzPXt0YXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLl9ldmVudC5zcmNFbGVtZW50KX0scmVsYXRlZFRhcmdldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2V2ZW50LHQ9dVtlLnR5cGVdfHwicmVsYXRlZFRhcmdldCI7cmV0dXJuIGEoZVt0XXx8ZS5yZWxhdGVkVGFyZ2V0KX0sY3VycmVudFRhcmdldDpmdW5jdGlvbigpe3JldHVybiBhKHRoaXMuX2N1cnJlbnRUYXJnZXQpfSx3aGVlbERlbHRhOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fZXZlbnQ7aWYoZS50eXBlPT09Im1vdXNld2hlZWwifHxlLnR5cGU9PT0iRE9NTW91c2VTY3JvbGwiKXJldHVybiBlLmRldGFpbD9lLmRldGFpbCotMTpNYXRoLnJvdW5kKGUud2hlZWxEZWx0YS84MCl8fChlLndoZWVsRGVsdGE8MD8tMToxKX0scGFnZVg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9ldmVudCxuPXQucGFnZVgscixpLHM7cmV0dXJuIG49PT11bmRlZmluZWQmJihyPWUuY29uZmlnLmRvYyxpPXIuYm9keSYmci5ib2R5LnNjcm9sbExlZnQscz1yLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LG49dC5jbGllbnRYKyhzfHxpfHwwKSksbn0scGFnZVk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9ldmVudCxuPXQucGFnZVkscixpLHM7cmV0dXJuIG49PT11bmRlZmluZWQmJihyPWUuY29uZmlnLmRvYyxpPXIuYm9keSYmci5ib2R5LnNjcm9sbFRvcCxzPXIuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCxuPXQuY2xpZW50WSsoc3x8aXx8MCkpLG59fSxyLl9kZWZpbmU9ZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIocil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD9yOm4uY2FsbCh0aGlzKTtyZXR1cm4gZGVsZXRlIGVbdF0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6aSxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KSxpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpyLHNldDpyLGNvbmZpZ3VyYWJsZTohMH0pfTtpZihpJiYhaS5oYXNGZWF0dXJlKCJFdmVudHMiLCIyLjAiKSl7aWYocyl0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUuY29uZmlnLmRvYy5jcmVhdGVFdmVudE9iamVjdCgpLCJ6Iix7fSl9Y2F0Y2gobCl7cz0hMX1lLkRPTUV2ZW50RmFjYWRlPXM/cjpufX0sIjMuMTcuMiIse3JlcXVpcmVzOlsibm9kZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInBsdWdpbmhvc3QtYmFzZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKCl7dGhpcy5fcGx1Z2lucz17fX12YXIgbj1lLkxhbmc7ci5wcm90b3R5cGU9e3BsdWc6ZnVuY3Rpb24oZSx0KXt2YXIgcixpLHM7aWYobi5pc0FycmF5KGUpKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7cisrKXRoaXMucGx1ZyhlW3JdKTtlbHNlIGUmJiFuLmlzRnVuY3Rpb24oZSkmJih0PWUuY2ZnLGU9ZS5mbiksZSYmZS5OUyYmKHM9ZS5OUyx0PXR8fHt9LHQuaG9zdD10aGlzLHRoaXMuaGFzUGx1Z2luKHMpP3RoaXNbc10uc2V0QXR0cnMmJnRoaXNbc10uc2V0QXR0cnModCk6KHRoaXNbc109bmV3IGUodCksdGhpcy5fcGx1Z2luc1tzXT1lKSk7cmV0dXJuIHRoaXN9LHVucGx1ZzpmdW5jdGlvbihlKXt2YXIgdD1lLHI9dGhpcy5fcGx1Z2lucztpZihlKW4uaXNGdW5jdGlvbihlKSYmKHQ9ZS5OUyx0JiYoIXJbdF18fHJbdF0hPT1lKSYmKHQ9bnVsbCkpLHQmJih0aGlzW3RdJiYodGhpc1t0XS5kZXN0cm95JiZ0aGlzW3RdLmRlc3Ryb3koKSxkZWxldGUgdGhpc1t0XSksclt0XSYmZGVsZXRlIHJbdF0pO2Vsc2UgZm9yKHQgaW4gdGhpcy5fcGx1Z2lucyl0aGlzLl9wbHVnaW5zLmhhc093blByb3BlcnR5KHQpJiZ0aGlzLnVucGx1Zyh0KTtyZXR1cm4gdGhpc30saGFzUGx1Z2luOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wbHVnaW5zW2VdJiZ0aGlzW2VdfSxfaW5pdFBsdWdpbnM6ZnVuY3Rpb24oZSl7dGhpcy5fcGx1Z2lucz10aGlzLl9wbHVnaW5zfHx7fSx0aGlzLl9pbml0Q29uZmlnUGx1Z2lucyYmdGhpcy5faW5pdENvbmZpZ1BsdWdpbnMoZSl9LF9kZXN0cm95UGx1Z2luczpmdW5jdGlvbigpe3RoaXMudW5wbHVnKCl9fSxlLm5hbWVzcGFjZSgiUGx1Z2luIikuSG9zdD1yfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJwbHVnaW5ob3N0LWNvbmZpZyIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLlBsdWdpbi5Ib3N0LHI9ZS5MYW5nO24ucHJvdG90eXBlLl9pbml0Q29uZmlnUGx1Z2lucz1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRDbGFzc2VzP3RoaXMuX2dldENsYXNzZXMoKTpbdGhpcy5jb25zdHJ1Y3Rvcl0scj1bXSxpPXt9LHMsbyx1LGEsZjtmb3Iobz1uLmxlbmd0aC0xO28+PTA7by0tKXM9bltvXSxhPXMuX1VOUExVRyxhJiZlLm1peChpLGEsITApLHU9cy5fUExVRyx1JiZlLm1peChyLHUsITApO2ZvcihmIGluIHIpci5oYXNPd25Qcm9wZXJ0eShmKSYmKGlbZl18fHRoaXMucGx1ZyhyW2ZdKSk7dCYmdC5wbHVnaW5zJiZ0aGlzLnBsdWcodC5wbHVnaW5zKX0sbi5wbHVnPWZ1bmN0aW9uKHQsbixpKXt2YXIgcyxvLHUsYTtpZih0IT09ZS5CYXNlKXt0Ll9QTFVHPXQuX1BMVUd8fHt9LHIuaXNBcnJheShuKXx8KGkmJihuPXtmbjpuLGNmZzppfSksbj1bbl0pO2ZvcihvPTAsdT1uLmxlbmd0aDtvPHU7bysrKXM9bltvXSxhPXMuTkFNRXx8cy5mbi5OQU1FLHQuX1BMVUdbYV09c319LG4udW5wbHVnPWZ1bmN0aW9uKHQsbil7dmFyIGkscyxvLHU7aWYodCE9PWUuQmFzZSl7dC5fVU5QTFVHPXQuX1VOUExVR3x8e30sci5pc0FycmF5KG4pfHwobj1bbl0pO2ZvcihzPTAsbz1uLmxlbmd0aDtzPG87cysrKWk9bltzXSx1PWkuTkFNRSx0Ll9QTFVHW3VdP2RlbGV0ZSB0Ll9QTFVHW3VdOnQuX1VOUExVR1t1XT1pfX19LCIzLjE3LjIiLHtyZXF1aXJlczpbInBsdWdpbmhvc3QtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1kZWxlZ2F0ZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBmKHQscix1LGwpe3ZhciBjPW4oYXJndW1lbnRzLDAsITApLGg9aSh1KT91Om51bGwscCxkLHYsbSxnLHksYix3LEU7aWYocyh0KSl7dz1bXTtpZihvKHQpKWZvcih5PTAsYj10Lmxlbmd0aDt5PGI7Kyt5KWNbMF09dFt5XSx3LnB1c2goZS5kZWxlZ2F0ZS5hcHBseShlLGMpKTtlbHNle2MudW5zaGlmdChudWxsKTtmb3IoeSBpbiB0KXQuaGFzT3duUHJvcGVydHkoeSkmJihjWzBdPXksY1sxXT10W3ldLHcucHVzaChlLmRlbGVnYXRlLmFwcGx5KGUsYykpKX1yZXR1cm4gbmV3IGUuRXZlbnRIYW5kbGUodyl9cD10LnNwbGl0KC9cfC8pLHAubGVuZ3RoPjEmJihnPXAuc2hpZnQoKSxjWzBdPXQ9cC5zaGlmdCgpKSxkPWUuTm9kZS5ET01fRVZFTlRTW3RdLHMoZCkmJmQuZGVsZWdhdGUmJihFPWQuZGVsZWdhdGUuYXBwbHkoZCxhcmd1bWVudHMpKTtpZighRSl7aWYoIXR8fCFyfHwhdXx8IWwpcmV0dXJuO3Y9aD9lLlNlbGVjdG9yLnF1ZXJ5KGgsbnVsbCwhMCk6dSwhdiYmaSh1KSYmKEU9ZS5vbigiYXZhaWxhYmxlIixmdW5jdGlvbigpe2UubWl4KEUsZS5kZWxlZ2F0ZS5hcHBseShlLGMpLCEwKX0sdSkpLCFFJiZ2JiYoYy5zcGxpY2UoMiwyLHYpLEU9ZS5FdmVudC5fYXR0YWNoKGMse2ZhY2FkZTohMX0pLEUuc3ViLmZpbHRlcj1sLEUuc3ViLl9ub3RpZnk9Zi5ub3RpZnlTdWIpfXJldHVybiBFJiZnJiYobT1hW2ddfHwoYVtnXT17fSksbT1tW3RdfHwobVt0XT1bXSksbS5wdXNoKEUpKSxFfXZhciBuPWUuQXJyYXkscj1lLkxhbmcsaT1yLmlzU3RyaW5nLHM9ci5pc09iamVjdCxvPXIuaXNBcnJheSx1PWUuU2VsZWN0b3IudGVzdCxhPWUuRW52LmV2dC5oYW5kbGVzO2Yubm90aWZ5U3ViPWZ1bmN0aW9uKHQscixpKXtyPXIuc2xpY2UoKSx0aGlzLmFyZ3MmJnIucHVzaC5hcHBseShyLHRoaXMuYXJncyk7dmFyIHM9Zi5fYXBwbHlGaWx0ZXIodGhpcy5maWx0ZXIscixpKSxvLHUsYSxsO2lmKHMpe3M9bihzKSxvPXJbMF09bmV3IGUuRE9NRXZlbnRGYWNhZGUoclswXSxpLmVsLGkpLG8uY29udGFpbmVyPWUub25lKGkuZWwpO2Zvcih1PTAsYT1zLmxlbmd0aDt1PGEmJiFvLnN0b3BwZWQ7Kyt1KXtvLmN1cnJlbnRUYXJnZXQ9ZS5vbmUoc1t1XSksbD10aGlzLmZuLmFwcGx5KHRoaXMuY29udGV4dHx8by5jdXJyZW50VGFyZ2V0LHIpO2lmKGw9PT0hMSlicmVha31yZXR1cm4gbH19LGYuY29tcGlsZUZpbHRlcj1lLmNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gdSh0Ll9ub2RlLGUsbi5jdXJyZW50VGFyZ2V0PT09bi50YXJnZXQ/bnVsbDpuLmN1cnJlbnRUYXJnZXQuX25vZGUpfX0pLGYuX2Rpc2FibGVkUkU9L14oPzpidXR0b258aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaSxmLl9hcHBseUZpbHRlcj1mdW5jdGlvbih0LG4scil7dmFyIHM9blswXSxvPXIuZWwsYT1zLnRhcmdldHx8cy5zcmNFbGVtZW50LGw9W10sYz0hMTthLm5vZGVUeXBlPT09MyYmKGE9YS5wYXJlbnROb2RlKTtpZihhLmRpc2FibGVkJiZmLl9kaXNhYmxlZFJFLnRlc3QoYS5ub2RlTmFtZSkpcmV0dXJuIGw7bi51bnNoaWZ0KGEpO2lmKGkodCkpd2hpbGUoYSl7Yz1hPT09byx1KGEsdCxjP251bGw6bykmJmwucHVzaChhKTtpZihjKWJyZWFrO2E9YS5wYXJlbnROb2RlfWVsc2V7blswXT1lLm9uZShhKSxuWzFdPW5ldyBlLkRPTUV2ZW50RmFjYWRlKHMsbyxyKTt3aGlsZShhKXt0LmFwcGx5KG5bMF0sbikmJmwucHVzaChhKTtpZihhPT09bylicmVhazthPWEucGFyZW50Tm9kZSxuWzBdPWUub25lKGEpfW5bMV09c31yZXR1cm4gbC5sZW5ndGg8PTEmJihsPWxbMF0pLG4uc2hpZnQoKSxsfSxlLmRlbGVnYXRlPWUuRXZlbnQuZGVsZWdhdGU9Zn0sIjMuMTcuMiIse3JlcXVpcmVzOlsibm9kZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtZXZlbnQtZGVsZWdhdGUiLGZ1bmN0aW9uKGUsdCl7ZS5Ob2RlLnByb3RvdHlwZS5kZWxlZ2F0ZT1mdW5jdGlvbih0KXt2YXIgbj1lLkFycmF5KGFyZ3VtZW50cywwLCEwKSxyPWUuTGFuZy5pc09iamVjdCh0KSYmIWUuTGFuZy5pc0FycmF5KHQpPzE6MjtyZXR1cm4gbi5zcGxpY2UociwwLHRoaXMuX25vZGUpLGUuZGVsZWdhdGUuYXBwbHkoZSxuKX19LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWRlbGVnYXRlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtcGx1Z2luaG9zdCIsZnVuY3Rpb24oZSx0KXtlLk5vZGUucGx1Zz1mdW5jdGlvbigpe3ZhciB0PWUuQXJyYXkoYXJndW1lbnRzKTtyZXR1cm4gdC51bnNoaWZ0KGUuTm9kZSksZS5QbHVnaW4uSG9zdC5wbHVnLmFwcGx5KGUuQmFzZSx0KSxlLk5vZGV9LGUuTm9kZS51bnBsdWc9ZnVuY3Rpb24oKXt2YXIgdD1lLkFycmF5KGFyZ3VtZW50cyk7cmV0dXJuIHQudW5zaGlmdChlLk5vZGUpLGUuUGx1Z2luLkhvc3QudW5wbHVnLmFwcGx5KGUuQmFzZSx0KSxlLk5vZGV9LGUubWl4KGUuTm9kZSxlLlBsdWdpbi5Ib3N0LCExLG51bGwsMSksZS5PYmplY3QuZWFjaChlLk5vZGUuX2luc3RhbmNlcyxmdW5jdGlvbih0KXtlLlBsdWdpbi5Ib3N0LmFwcGx5KHQpfSksZS5Ob2RlTGlzdC5wcm90b3R5cGUucGx1Zz1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztyZXR1cm4gZS5Ob2RlTGlzdC5lYWNoKHRoaXMsZnVuY3Rpb24obil7ZS5Ob2RlLnByb3RvdHlwZS5wbHVnLmFwcGx5KGUub25lKG4pLHQpfSksdGhpc30sZS5Ob2RlTGlzdC5wcm90b3R5cGUudW5wbHVnPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiBlLk5vZGVMaXN0LmVhY2godGhpcyxmdW5jdGlvbihuKXtlLk5vZGUucHJvdG90eXBlLnVucGx1Zy5hcHBseShlLm9uZShuKSx0KX0pLHRoaXN9fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJub2RlLWJhc2UiLCJwbHVnaW5ob3N0Il19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImRvbS1zY3JlZW4iLGZ1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKGUpe3ZhciB0PSJkb2N1bWVudEVsZW1lbnQiLG49ImNvbXBhdE1vZGUiLHI9InBvc2l0aW9uIixpPSJmaXhlZCIscz0icmVsYXRpdmUiLG89ImxlZnQiLHU9InRvcCIsYT0iQmFja0NvbXBhdCIsZj0ibWVkaXVtIixsPSJib3JkZXJMZWZ0V2lkdGgiLGM9ImJvcmRlclRvcFdpZHRoIixoPSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLHA9ImdldENvbXB1dGVkU3R5bGUiLGQ9ZS5ET00sdj0vXnQoPzphYmxlfGR8aCkkL2ksbTtlLlVBLmllJiYoZS5jb25maWcuZG9jW25dIT09IkJhY2tDb21wYXQiP209dDptPSJib2R5IiksZS5taXgoZCx7d2luSGVpZ2h0OmZ1bmN0aW9uKGUpe3ZhciB0PWQuX2dldFdpblNpemUoZSkuaGVpZ2h0O3JldHVybiB0fSx3aW5XaWR0aDpmdW5jdGlvbihlKXt2YXIgdD1kLl9nZXRXaW5TaXplKGUpLndpZHRoO3JldHVybiB0fSxkb2NIZWlnaHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZC5fZ2V0RG9jU2l6ZShlKS5oZWlnaHQ7cmV0dXJuIE1hdGgubWF4KHQsZC5fZ2V0V2luU2l6ZShlKS5oZWlnaHQpfSxkb2NXaWR0aDpmdW5jdGlvbihlKXt2YXIgdD1kLl9nZXREb2NTaXplKGUpLndpZHRoO3JldHVybiBNYXRoLm1heCh0LGQuX2dldFdpblNpemUoZSkud2lkdGgpfSxkb2NTY3JvbGxYOmZ1bmN0aW9uKG4scil7cj1yfHxuP2QuX2dldERvYyhuKTplLmNvbmZpZy5kb2M7dmFyIGk9ci5kZWZhdWx0VmlldyxzPWk/aS5wYWdlWE9mZnNldDowO3JldHVybiBNYXRoLm1heChyW3RdLnNjcm9sbExlZnQsci5ib2R5LnNjcm9sbExlZnQscyl9LGRvY1Njcm9sbFk6ZnVuY3Rpb24obixyKXtyPXJ8fG4/ZC5fZ2V0RG9jKG4pOmUuY29uZmlnLmRvYzt2YXIgaT1yLmRlZmF1bHRWaWV3LHM9aT9pLnBhZ2VZT2Zmc2V0OjA7cmV0dXJuIE1hdGgubWF4KHJbdF0uc2Nyb2xsVG9wLHIuYm9keS5zY3JvbGxUb3Ascyl9LGdldFhZOmZ1bmN0aW9uKCl7cmV0dXJuIGUuY29uZmlnLmRvY1t0XVtoXT9mdW5jdGlvbihyKXt2YXIgaT1udWxsLHMsbyx1LGYsbCxjLHAsdixnLHk7aWYociYmci50YWdOYW1lKXtwPXIub3duZXJEb2N1bWVudCx1PXBbbl0sdSE9PWE/eT1wW3RdOnk9cC5ib2R5LHkuY29udGFpbnM/Zz15LmNvbnRhaW5zKHIpOmc9ZS5ET00uY29udGFpbnMoeSxyKTtpZihnKXt2PXAuZGVmYXVsdFZpZXcsdiYmInBhZ2VYT2Zmc2V0ImluIHY/KHM9di5wYWdlWE9mZnNldCxvPXYucGFnZVlPZmZzZXQpOihzPW0/cFttXS5zY3JvbGxMZWZ0OmQuZG9jU2Nyb2xsWChyLHApLG89bT9wW21dLnNjcm9sbFRvcDpkLmRvY1Njcm9sbFkocixwKSksZS5VQS5pZSYmKCFwLmRvY3VtZW50TW9kZXx8cC5kb2N1bWVudE1vZGU8OHx8dT09PWEpJiYobD15LmNsaWVudExlZnQsYz15LmNsaWVudFRvcCksZj1yW2hdKCksaT1bZi5sZWZ0LGYudG9wXTtpZihsfHxjKWlbMF0tPWwsaVsxXS09YztpZihvfHxzKWlmKCFlLlVBLmlvc3x8ZS5VQS5pb3M+PTQuMilpWzBdKz1zLGlbMV0rPW99ZWxzZSBpPWQuX2dldE9mZnNldChyKX1yZXR1cm4gaX06ZnVuY3Rpb24odCl7dmFyIG49bnVsbCxzLG8sdSxhLGY7aWYodClpZihkLmluRG9jKHQpKXtuPVt0Lm9mZnNldExlZnQsdC5vZmZzZXRUb3BdLHM9dC5vd25lckRvY3VtZW50LG89dCx1PWUuVUEuZ2Vja298fGUuVUEud2Via2l0PjUxOT8hMDohMTt3aGlsZShvPW8ub2Zmc2V0UGFyZW50KW5bMF0rPW8ub2Zmc2V0TGVmdCxuWzFdKz1vLm9mZnNldFRvcCx1JiYobj1kLl9jYWxjQm9yZGVycyhvLG4pKTtpZihkLmdldFN0eWxlKHQscikhPWkpe289dDt3aGlsZShvPW8ucGFyZW50Tm9kZSl7YT1vLnNjcm9sbFRvcCxmPW8uc2Nyb2xsTGVmdCxlLlVBLmdlY2tvJiZkLmdldFN0eWxlKG8sIm92ZXJmbG93IikhPT0idmlzaWJsZSImJihuPWQuX2NhbGNCb3JkZXJzKG8sbikpO2lmKGF8fGYpblswXS09ZixuWzFdLT1hfW5bMF0rPWQuZG9jU2Nyb2xsWCh0LHMpLG5bMV0rPWQuZG9jU2Nyb2xsWSh0LHMpfWVsc2UgblswXSs9ZC5kb2NTY3JvbGxYKHQscyksblsxXSs9ZC5kb2NTY3JvbGxZKHQscyl9ZWxzZSBuPWQuX2dldE9mZnNldCh0KTtyZXR1cm4gbn19KCksZ2V0U2Nyb2xsYmFyV2lkdGg6ZS5jYWNoZWQoZnVuY3Rpb24oKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHI9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGk9LjE7cmV0dXJuIHImJihuLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO3Zpc2liaWxpdHk6aGlkZGVuO292ZXJmbG93OnNjcm9sbDt3aWR0aDoyMHB4OyIsbi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoInAiKSkuc3R5bGUuaGVpZ2h0PSIxcHgiLHIuaW5zZXJ0QmVmb3JlKG4sci5maXJzdENoaWxkKSxpPW4ub2Zmc2V0V2lkdGgtbi5jbGllbnRXaWR0aCxyLnJlbW92ZUNoaWxkKG4pKSxpfSxudWxsLC4xKSxnZXRYOmZ1bmN0aW9uKGUpe3JldHVybiBkLmdldFhZKGUpWzBdfSxnZXRZOmZ1bmN0aW9uKGUpe3JldHVybiBkLmdldFhZKGUpWzFdfSxzZXRYWTpmdW5jdGlvbihlLHQsbil7dmFyIGk9ZC5zZXRTdHlsZSxhLGYsbCxjO2UmJnQmJihhPWQuZ2V0U3R5bGUoZSxyKSxmPWQuX2dldE9mZnNldChlKSxhPT0ic3RhdGljIiYmKGE9cyxpKGUscixhKSksYz1kLmdldFhZKGUpLHRbMF0hPT1udWxsJiZpKGUsbyx0WzBdLWNbMF0rZlswXSsicHgiKSx0WzFdIT09bnVsbCYmaShlLHUsdFsxXS1jWzFdK2ZbMV0rInB4Iiksbnx8KGw9ZC5nZXRYWShlKSwobFswXSE9PXRbMF18fGxbMV0hPT10WzFdKSYmZC5zZXRYWShlLHQsITApKSl9LHNldFg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZC5zZXRYWShlLFt0LG51bGxdKX0sc2V0WTpmdW5jdGlvbihlLHQpe3JldHVybiBkLnNldFhZKGUsW251bGwsdF0pfSxzd2FwWFk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1kLmdldFhZKGUpO2Quc2V0WFkoZSxkLmdldFhZKHQpKSxkLnNldFhZKHQsbil9LF9jYWxjQm9yZGVyczpmdW5jdGlvbih0LG4pe3ZhciByPXBhcnNlSW50KGRbcF0odCxjKSwxMCl8fDAsaT1wYXJzZUludChkW3BdKHQsbCksMTApfHwwO3JldHVybiBlLlVBLmdlY2tvJiZ2LnRlc3QodC50YWdOYW1lKSYmKHI9MCxpPTApLG5bMF0rPWksblsxXSs9cixufSxfZ2V0V2luU2l6ZTpmdW5jdGlvbihyLGkpe2k9aXx8cj9kLl9nZXREb2Mocik6ZS5jb25maWcuZG9jO3ZhciBzPWkuZGVmYXVsdFZpZXd8fGkucGFyZW50V2luZG93LG89aVtuXSx1PXMuaW5uZXJIZWlnaHQsYT1zLmlubmVyV2lkdGgsZj1pW3RdO3JldHVybiBvJiYhZS5VQS5vcGVyYSYmKG8hPSJDU1MxQ29tcGF0IiYmKGY9aS5ib2R5KSx1PWYuY2xpZW50SGVpZ2h0LGE9Zi5jbGllbnRXaWR0aCkse2hlaWdodDp1LHdpZHRoOmF9fSxfZ2V0RG9jU2l6ZTpmdW5jdGlvbihyKXt2YXIgaT1yP2QuX2dldERvYyhyKTplLmNvbmZpZy5kb2Mscz1pW3RdO3JldHVybiBpW25dIT0iQ1NTMUNvbXBhdCImJihzPWkuYm9keSkse2hlaWdodDpzLnNjcm9sbEhlaWdodCx3aWR0aDpzLnNjcm9sbFdpZHRofX19KX0pKGUpLGZ1bmN0aW9uKGUpe3ZhciB0PSJ0b3AiLG49InJpZ2h0IixyPSJib3R0b20iLGk9ImxlZnQiLHM9ZnVuY3Rpb24oZSxzKXt2YXIgbz1NYXRoLm1heChlW3RdLHNbdF0pLHU9TWF0aC5taW4oZVtuXSxzW25dKSxhPU1hdGgubWluKGVbcl0sc1tyXSksZj1NYXRoLm1heChlW2ldLHNbaV0pLGw9e307cmV0dXJuIGxbdF09byxsW25dPXUsbFtyXT1hLGxbaV09ZixsfSxvPWUuRE9NO2UubWl4KG8se3JlZ2lvbjpmdW5jdGlvbihlKXt2YXIgdD1vLmdldFhZKGUpLG49ITE7cmV0dXJuIGUmJnQmJihuPW8uX2dldFJlZ2lvbih0WzFdLHRbMF0rZS5vZmZzZXRXaWR0aCx0WzFdK2Uub2Zmc2V0SGVpZ2h0LHRbMF0pKSxufSxpbnRlcnNlY3Q6ZnVuY3Rpb24odSxhLGYpe3ZhciBsPWZ8fG8ucmVnaW9uKHUpLGM9e30saD1hLHA7aWYoaC50YWdOYW1lKWM9by5yZWdpb24oaCk7ZWxzZXtpZighZS5MYW5nLmlzT2JqZWN0KGEpKXJldHVybiExO2M9YX1yZXR1cm4gcD1zKGMsbCkse3RvcDpwW3RdLHJpZ2h0OnBbbl0sYm90dG9tOnBbcl0sbGVmdDpwW2ldLGFyZWE6KHBbcl0tcFt0XSkqKHBbbl0tcFtpXSkseW9mZjpwW3JdLXBbdF0seG9mZjpwW25dLXBbaV0saW5SZWdpb246by5pblJlZ2lvbih1LGEsITEsZil9fSxpblJlZ2lvbjpmdW5jdGlvbih1LGEsZixsKXt2YXIgYz17fSxoPWx8fG8ucmVnaW9uKHUpLHA9YSxkO2lmKHAudGFnTmFtZSljPW8ucmVnaW9uKHApO2Vsc2V7aWYoIWUuTGFuZy5pc09iamVjdChhKSlyZXR1cm4hMTtjPWF9cmV0dXJuIGY/aFtpXT49Y1tpXSYmaFtuXTw9Y1tuXSYmaFt0XT49Y1t0XSYmaFtyXTw9Y1tyXTooZD1zKGMsaCksZFtyXT49ZFt0XSYmZFtuXT49ZFtpXT8hMDohMSl9LGluVmlld3BvcnRSZWdpb246ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBvLmluUmVnaW9uKGUsby52aWV3cG9ydFJlZ2lvbihlKSx0LG4pfSxfZ2V0UmVnaW9uOmZ1bmN0aW9uKGUscyxvLHUpe3ZhciBhPXt9O3JldHVybiBhW3RdPWFbMV09ZSxhW2ldPWFbMF09dSxhW3JdPW8sYVtuXT1zLGEud2lkdGg9YVtuXS1hW2ldLGEuaGVpZ2h0PWFbcl0tYVt0XSxhfSx2aWV3cG9ydFJlZ2lvbjpmdW5jdGlvbih0KXt0PXR8fGUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnQ7dmFyIG49ITEscixpO3JldHVybiB0JiYocj1vLmRvY1Njcm9sbFgodCksaT1vLmRvY1Njcm9sbFkodCksbj1vLl9nZXRSZWdpb24oaSxvLndpbldpZHRoKHQpK3IsaStvLndpbkhlaWdodCh0KSxyKSksbn19KX0oZSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1iYXNlIiwiZG9tLXN0eWxlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtc2NyZWVuIixmdW5jdGlvbihlLHQpe2UuZWFjaChbIndpbldpZHRoIiwid2luSGVpZ2h0IiwiZG9jV2lkdGgiLCJkb2NIZWlnaHQiLCJkb2NTY3JvbGxYIiwiZG9jU2Nyb2xsWSJdLGZ1bmN0aW9uKHQpe2UuTm9kZS5BVFRSU1t0XT17Z2V0dGVyOmZ1bmN0aW9uKCl7dmFyIG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gbi51bnNoaWZ0KGUuTm9kZS5nZXRET01Ob2RlKHRoaXMpKSxlLkRPTVt0XS5hcHBseSh0aGlzLG4pfX19KSxlLk5vZGUuQVRUUlMuc2Nyb2xsTGVmdD17Z2V0dGVyOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5Ob2RlLmdldERPTU5vZGUodGhpcyk7cmV0dXJuInNjcm9sbExlZnQiaW4gdD90LnNjcm9sbExlZnQ6ZS5ET00uZG9jU2Nyb2xsWCh0KX0sc2V0dGVyOmZ1bmN0aW9uKHQpe3ZhciBuPWUuTm9kZS5nZXRET01Ob2RlKHRoaXMpO24mJigic2Nyb2xsTGVmdCJpbiBuP24uc2Nyb2xsTGVmdD10OihuLmRvY3VtZW50fHxuLm5vZGVUeXBlPT09OSkmJmUuRE9NLl9nZXRXaW4obikuc2Nyb2xsVG8odCxlLkRPTS5kb2NTY3JvbGxZKG4pKSl9fSxlLk5vZGUuQVRUUlMuc2Nyb2xsVG9wPXtnZXR0ZXI6ZnVuY3Rpb24oKXt2YXIgdD1lLk5vZGUuZ2V0RE9NTm9kZSh0aGlzKTtyZXR1cm4ic2Nyb2xsVG9wImluIHQ/dC5zY3JvbGxUb3A6ZS5ET00uZG9jU2Nyb2xsWSh0KX0sc2V0dGVyOmZ1bmN0aW9uKHQpe3ZhciBuPWUuTm9kZS5nZXRET01Ob2RlKHRoaXMpO24mJigic2Nyb2xsVG9wImluIG4/bi5zY3JvbGxUb3A9dDoobi5kb2N1bWVudHx8bi5ub2RlVHlwZT09PTkpJiZlLkRPTS5fZ2V0V2luKG4pLnNjcm9sbFRvKGUuRE9NLmRvY1Njcm9sbFgobiksdCkpfX0sZS5Ob2RlLmltcG9ydE1ldGhvZChlLkRPTSxbImdldFhZIiwic2V0WFkiLCJnZXRYIiwic2V0WCIsImdldFkiLCJzZXRZIiwic3dhcFhZIl0pLGUuTm9kZS5BVFRSUy5yZWdpb249e2dldHRlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0RE9NTm9kZSgpLG47cmV0dXJuIHQmJiF0LnRhZ05hbWUmJnQubm9kZVR5cGU9PT05JiYodD10LmRvY3VtZW50RWxlbWVudCksZS5ET00uaXNXaW5kb3codCk/bj1lLkRPTS52aWV3cG9ydFJlZ2lvbih0KTpuPWUuRE9NLnJlZ2lvbih0KSxufX0sZS5Ob2RlLkFUVFJTLnZpZXdwb3J0UmVnaW9uPXtnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gZS5ET00udmlld3BvcnRSZWdpb24oZS5Ob2RlLmdldERPTU5vZGUodGhpcykpfX0sZS5Ob2RlLmltcG9ydE1ldGhvZChlLkRPTSwiaW5WaWV3cG9ydFJlZ2lvbiIpLGUuTm9kZS5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5Ob2RlLmdldERPTU5vZGUodGhpcyk7cmV0dXJuIGUuaW5zdGFuY2VPZih0LGUuTm9kZSkmJih0PWUuTm9kZS5nZXRET01Ob2RlKHQpKSxlLkRPTS5pbnRlcnNlY3Qocix0LG4pfSxlLk5vZGUucHJvdG90eXBlLmluUmVnaW9uPWZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLk5vZGUuZ2V0RE9NTm9kZSh0aGlzKTtyZXR1cm4gZS5pbnN0YW5jZU9mKHQsZS5Ob2RlKSYmKHQ9ZS5Ob2RlLmdldERPTU5vZGUodCkpLGUuRE9NLmluUmVnaW9uKGksdCxuLHIpfX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZG9tLXNjcmVlbiIsIm5vZGUtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJub2RlLXN0eWxlIixmdW5jdGlvbihlLHQpeyhmdW5jdGlvbihlKXtlLm1peChlLk5vZGUucHJvdG90eXBlLHtzZXRTdHlsZTpmdW5jdGlvbih0LG4pe3JldHVybiBlLkRPTS5zZXRTdHlsZSh0aGlzLl9ub2RlLHQsbiksdGhpc30sc2V0U3R5bGVzOmZ1bmN0aW9uKHQpe3JldHVybiBlLkRPTS5zZXRTdHlsZXModGhpcy5fbm9kZSx0KSx0aGlzfSxnZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gZS5ET00uZ2V0U3R5bGUodGhpcy5fbm9kZSx0KX0sZ2V0Q29tcHV0ZWRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gZS5ET00uZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9ub2RlLHQpfX0pLGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJnZXRTdHlsZSIsImdldENvbXB1dGVkU3R5bGUiLCJzZXRTdHlsZSIsInNldFN0eWxlcyJdKX0pKGUpO3ZhciBuPWUuTm9kZTtlLm1peChuLnByb3RvdHlwZSx7c2hvdzpmdW5jdGlvbihlKXtyZXR1cm4gZT1hcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXSx0aGlzLnRvZ2dsZVZpZXcoITAsZSksdGhpc30sX3Nob3c6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIiksdGhpcy5zZXRTdHlsZSgiZGlzcGxheSIsIiIpfSxfaXNIaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoImhpZGRlbiIpfHxlLkRPTS5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX25vZGUsImRpc3BsYXkiKT09PSJub25lIn0sdG9nZ2xlVmlldzpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl90b2dnbGVWaWV3LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzfSxfdG9nZ2xlVmlldzpmdW5jdGlvbihlLHQpe3JldHVybiB0PWFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdLHR5cGVvZiBlIT0iYm9vbGVhbiImJihlPXRoaXMuX2lzSGlkZGVuKCk/MTowKSxlP3RoaXMuX3Nob3coKTp0aGlzLl9oaWRlKCksdHlwZW9mIHQ9PSJmdW5jdGlvbiImJnQuY2FsbCh0aGlzKSx0aGlzfSxoaWRlOmZ1bmN0aW9uKGUpe3JldHVybiBlPWFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdLHRoaXMudG9nZ2xlVmlldyghMSxlKSx0aGlzfSxfaGlkZTpmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCJoaWRkZW4iKSx0aGlzLnNldFN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpfX0pLGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJzaG93IiwiaGlkZSIsInRvZ2dsZVZpZXciXSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1zdHlsZSIsIm5vZGUtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJxdWVyeXN0cmluZy1zdHJpbmdpZnktc2ltcGxlIixmdW5jdGlvbihlLHQpe3ZhciBuPWUubmFtZXNwYWNlKCJRdWVyeVN0cmluZyIpLHI9ZW5jb2RlVVJJQ29tcG9uZW50O24uc3RyaW5naWZ5PWZ1bmN0aW9uKHQsbil7dmFyIGk9W10scz1uJiZuLmFycmF5S2V5PyEwOiExLG8sdSxhO2ZvcihvIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShvKSlpZihlLkxhbmcuaXNBcnJheSh0W29dKSlmb3IodT0wLGE9dFtvXS5sZW5ndGg7dTxhO3UrKylpLnB1c2gocihzP28rIltdIjpvKSsiPSIrcih0W29dW3VdKSk7ZWxzZSBpLnB1c2gocihvKSsiPSIrcih0W29dKSk7cmV0dXJuIGkuam9pbigiJiIpfX0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiaW8tYmFzZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBvKHQpe3ZhciBuPXRoaXM7bi5fdWlkPSJpbzoiK3MrKyxuLl9pbml0KHQpLGUuaW8uX21hcFtuLl91aWRdPW59dmFyIG49WyJzdGFydCIsImNvbXBsZXRlIiwiZW5kIiwic3VjY2VzcyIsImZhaWx1cmUiLCJwcm9ncmVzcyJdLHI9WyJzdGF0dXMiLCJzdGF0dXNUZXh0IiwicmVzcG9uc2VUZXh0IiwicmVzcG9uc2VYTUwiXSxpPWUuY29uZmlnLndpbixzPTA7by5wcm90b3R5cGU9e19pZDowLF9oZWFkZXJzOnsiWC1SZXF1ZXN0ZWQtV2l0aCI6IlhNTEh0dHBSZXF1ZXN0In0sX3RpbWVvdXQ6e30sX2luaXQ6ZnVuY3Rpb24odCl7dmFyIHI9dGhpcyxpLHM7ci5jZmc9dHx8e30sZS5hdWdtZW50KHIsZS5FdmVudFRhcmdldCk7Zm9yKGk9MCxzPW4ubGVuZ3RoO2k8czsrK2kpci5wdWJsaXNoKCJpbzoiK25baV0sZS5tZXJnZSh7YnJvYWRjYXN0OjF9LHQpKSxyLnB1Ymxpc2goImlvLXRybjoiK25baV0sdCl9LF9jcmVhdGU6ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzLHM9e2lkOmUuTGFuZy5pc051bWJlcihuKT9uOnIuX2lkKyssdWlkOnIuX3VpZH0sbz10Lnhkcj90Lnhkci51c2U6bnVsbCx1PXQuZm9ybSYmdC5mb3JtLnVwbG9hZD8iaWZyYW1lIjpudWxsLGE7cmV0dXJuIG89PT0ibmF0aXZlIiYmKG89ZS5VQS5pZSYmIWw/InhkciI6bnVsbCxyLnNldEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIpKSxhPW98fHUscz1hP2UubWVyZ2UoZS5JTy5jdXN0b21UcmFuc3BvcnQoYSkscyk6ZS5tZXJnZShlLklPLmRlZmF1bHRUcmFuc3BvcnQoKSxzKSxzLm5vdGlmeSYmKHQubm90aWZ5PWZ1bmN0aW9uKGUsdCxuKXtyLm5vdGlmeShlLHQsbil9KSxhfHxpJiZpLkZvcm1EYXRhJiZ0LmRhdGEgaW5zdGFuY2VvZiBpLkZvcm1EYXRhJiYocy5jLnVwbG9hZC5vbnByb2dyZXNzPWZ1bmN0aW9uKGUpe3IucHJvZ3Jlc3MocyxlLHQpfSxzLmMub25sb2FkPWZ1bmN0aW9uKGUpe3IubG9hZChzLGUsdCl9LHMuYy5vbmVycm9yPWZ1bmN0aW9uKGUpe3IuZXJyb3IocyxlLHQpfSxzLnVwbG9hZD0hMCksc30sX2Rlc3Ryb3k6ZnVuY3Rpb24odCl7aSYmIXQubm90aWZ5JiYhdC54ZHImJih1JiYhdC51cGxvYWQ/dC5jLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsOnQudXBsb2FkPyh0LmMudXBsb2FkLm9ucHJvZ3Jlc3M9bnVsbCx0LmMub25sb2FkPW51bGwsdC5jLm9uZXJyb3I9bnVsbCk6ZS5VQS5pZSYmIXQuZSYmdC5jLmFib3J0KCkpLHQ9dC5jPW51bGx9LF9ldnQ6ZnVuY3Rpb24odCxyLGkpe3ZhciBzPXRoaXMsbyx1PWkuYXJndW1lbnRzLGE9cy5jZmcuZW1pdEZhY2FkZSxmPSJpbzoiK3QsbD0iaW8tdHJuOiIrdDt0aGlzLmRldGFjaChsKSxyLmUmJihyLmM9e3N0YXR1czowLHN0YXR1c1RleHQ6ci5lfSksbz1bYT97aWQ6ci5pZCxkYXRhOnIuYyxjZmc6aSxhcmd1bWVudHM6dX06ci5pZF0sYXx8KHQ9PT1uWzBdfHx0PT09blsyXT91JiZvLnB1c2godSk6KHIuZXZ0P28ucHVzaChyLmV2dCk6by5wdXNoKHIuYyksdSYmby5wdXNoKHUpKSksby51bnNoaWZ0KGYpLHMuZmlyZS5hcHBseShzLG8pLGkub24mJihvWzBdPWwscy5vbmNlKGwsaS5vblt0XSxpLmNvbnRleHR8fGUpLHMuZmlyZS5hcHBseShzLG8pKX0sc3RhcnQ6ZnVuY3Rpb24oZSx0KXt0aGlzLl9ldnQoblswXSxlLHQpfSxjb21wbGV0ZTpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzFdLGUsdCl9LGVuZDpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzJdLGUsdCksdGhpcy5fZGVzdHJveShlKX0sc3VjY2VzczpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzNdLGUsdCksdGhpcy5lbmQoZSx0KX0sZmFpbHVyZTpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzRdLGUsdCksdGhpcy5lbmQoZSx0KX0scHJvZ3Jlc3M6ZnVuY3Rpb24oZSx0LHIpe2UuZXZ0PXQsdGhpcy5fZXZ0KG5bNV0sZSxyKX0sbG9hZDpmdW5jdGlvbihlLHQscil7ZS5ldnQ9dC50YXJnZXQsdGhpcy5fZXZ0KG5bMV0sZSxyKX0sZXJyb3I6ZnVuY3Rpb24oZSx0LHIpe2UuZXZ0PXQsdGhpcy5fZXZ0KG5bNF0sZSxyKX0sX3JldHJ5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fZGVzdHJveShlKSxuLnhkci51c2U9ImZsYXNoIix0aGlzLnNlbmQodCxuLGUuaWQpfSxfY29uY2F0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUrPShlLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK3QsZX0sc2V0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7dD90aGlzLl9oZWFkZXJzW2VdPXQ6ZGVsZXRlIHRoaXMuX2hlYWRlcnNbZV19LF9zZXRIZWFkZXJzOmZ1bmN0aW9uKHQsbil7bj1lLm1lcmdlKHRoaXMuX2hlYWRlcnMsbiksZS5PYmplY3QuZWFjaChuLGZ1bmN0aW9uKGUscil7ZSE9PSJkaXNhYmxlIiYmdC5zZXRSZXF1ZXN0SGVhZGVyKHIsbltyXSl9KX0sX3N0YXJ0VGltZW91dDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7bi5fdGltZW91dFtlLmlkXT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5fYWJvcnQoZSwidGltZW91dCIpfSx0KX0sX2NsZWFyVGltZW91dDpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dFtlXSksZGVsZXRlIHRoaXMuX3RpbWVvdXRbZV19LF9yZXN1bHQ6ZnVuY3Rpb24oZSx0KXt2YXIgbjt0cnl7bj1lLmMuc3RhdHVzfWNhdGNoKHIpe249MH1uPj0yMDAmJm48MzAwfHxuPT09MzA0fHxuPT09MTIyMz90aGlzLnN1Y2Nlc3MoZSx0KTp0aGlzLmZhaWx1cmUoZSx0KX0sX3JTOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztlLmMucmVhZHlTdGF0ZT09PTQmJih0LnRpbWVvdXQmJm4uX2NsZWFyVGltZW91dChlLmlkKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5jb21wbGV0ZShlLHQpLG4uX3Jlc3VsdChlLHQpfSwwKSl9LF9hYm9ydDpmdW5jdGlvbihlLHQpe2UmJmUuYyYmKGUuZT10LGUuYy5hYm9ydCgpKX0sc2VuZDpmdW5jdGlvbih0LG4saSl7dmFyIHMsbyx1LGEsZixjLGg9dGhpcyxwPXQsZD17fTtuPW4/ZS5PYmplY3Qobik6e30scz1oLl9jcmVhdGUobixpKSxvPW4ubWV0aG9kP24ubWV0aG9kLnRvVXBwZXJDYXNlKCk6IkdFVCIsZj1uLnN5bmMsYz1uLmRhdGEsZS5MYW5nLmlzT2JqZWN0KGMpJiYhYy5ub2RlVHlwZSYmIXMudXBsb2FkJiZlLlF1ZXJ5U3RyaW5nJiZlLlF1ZXJ5U3RyaW5nLnN0cmluZ2lmeSYmKG4uZGF0YT1jPWUuUXVlcnlTdHJpbmcuc3RyaW5naWZ5KGMpKTtpZihuLmZvcm0pe2lmKG4uZm9ybS51cGxvYWQpcmV0dXJuIGgudXBsb2FkKHMsdCxuKTtjPWguX3NlcmlhbGl6ZShuLmZvcm0sYyl9Y3x8KGM9IiIpO2lmKGMpc3dpdGNoKG8pe2Nhc2UiR0VUIjpjYXNlIkhFQUQiOmNhc2UiREVMRVRFIjpwPWguX2NvbmNhdChwLGMpLGM9IiI7YnJlYWs7Y2FzZSJQT1NUIjpjYXNlIlBVVCI6bi5oZWFkZXJzPWUubWVyZ2UoeyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgifSxuLmhlYWRlcnMpfWlmKHMueGRyKXJldHVybiBoLnhkcihwLHMsbik7aWYocy5ub3RpZnkpcmV0dXJuIHMuYy5zZW5kKHMsdCxuKTshZiYmIXMudXBsb2FkJiYocy5jLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2guX3JTKHMsbil9KTt0cnl7cy5jLm9wZW4obyxwLCFmLG4udXNlcm5hbWV8fG51bGwsbi5wYXNzd29yZHx8bnVsbCksaC5fc2V0SGVhZGVycyhzLmMsbi5oZWFkZXJzfHx7fSksaC5zdGFydChzLG4pLG4ueGRyJiZuLnhkci5jcmVkZW50aWFscyYmbCYmKHMuYy53aXRoQ3JlZGVudGlhbHM9ITApLHMuYy5zZW5kKGMpO2lmKGYpe2Zvcih1PTAsYT1yLmxlbmd0aDt1PGE7Kyt1KWRbclt1XV09cy5jW3JbdV1dO3JldHVybiBkLmdldEFsbFJlc3BvbnNlSGVhZGVycz1mdW5jdGlvbigpe3JldHVybiBzLmMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCl9LGQuZ2V0UmVzcG9uc2VIZWFkZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuYy5nZXRSZXNwb25zZUhlYWRlcihlKX0saC5jb21wbGV0ZShzLG4pLGguX3Jlc3VsdChzLG4pLGR9fWNhdGNoKHYpe2lmKHMueGRyKXJldHVybiBoLl9yZXRyeShzLHQsbik7aC5jb21wbGV0ZShzLG4pLGguX3Jlc3VsdChzLG4pfXJldHVybiBuLnRpbWVvdXQmJmguX3N0YXJ0VGltZW91dChzLG4udGltZW91dCkse2lkOnMuaWQsYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5jP2guX2Fib3J0KHMsImFib3J0Iik6ITF9LGlzSW5Qcm9ncmVzczpmdW5jdGlvbigpe3JldHVybiBzLmM/cy5jLnJlYWR5U3RhdGUlNDohMX0saW86aH19fSxlLmlvPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5pby5fbWFwWyJpbzowIl18fG5ldyBvO3JldHVybiByLnNlbmQuYXBwbHkocixbdCxuXSl9LGUuaW8uaGVhZGVyPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5pby5fbWFwWyJpbzowIl18fG5ldyBvO3Iuc2V0SGVhZGVyKHQsbil9LGUuSU89byxlLmlvLl9tYXA9e307dmFyIHU9aSYmaS5YTUxIdHRwUmVxdWVzdCxhPWkmJmkuWERvbWFpblJlcXVlc3QsZj1pJiZpLkFjdGl2ZVhPYmplY3QsbD11JiYid2l0aENyZWRlbnRpYWxzImluIG5ldyBYTUxIdHRwUmVxdWVzdDtlLm1peChlLklPLHtfZGVmYXVsdDoieGhyIixkZWZhdWx0VHJhbnNwb3J0OmZ1bmN0aW9uKHQpe2lmKCF0KXt2YXIgbj17YzplLklPLnRyYW5zcG9ydHNbZS5JTy5fZGVmYXVsdF0oKSxub3RpZnk6ZS5JTy5fZGVmYXVsdD09PSJ4aHIiPyExOiEwfTtyZXR1cm4gbn1lLklPLl9kZWZhdWx0PXR9LHRyYW5zcG9ydHM6e3hocjpmdW5jdGlvbigpe3JldHVybiB1P25ldyBYTUxIdHRwUmVxdWVzdDpmP25ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOm51bGx9LHhkcjpmdW5jdGlvbigpe3JldHVybiBhP25ldyBYRG9tYWluUmVxdWVzdDpudWxsfSxpZnJhbWU6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZmxhc2g6bnVsbCxub2RlanM6bnVsbH0sY3VzdG9tVHJhbnNwb3J0OmZ1bmN0aW9uKHQpe3ZhciBuPXtjOmUuSU8udHJhbnNwb3J0c1t0XSgpfTtyZXR1cm4gblt0PT09InhkciJ8fHQ9PT0iZmxhc2giPyJ4ZHIiOiJub3RpZnkiXT0hMCxufX0pLGUubWl4KGUuSU8ucHJvdG90eXBlLHtub3RpZnk6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7c3dpdGNoKGUpe2Nhc2UidGltZW91dCI6Y2FzZSJhYm9ydCI6Y2FzZSJ0cmFuc3BvcnQgZXJyb3IiOnQuYz17c3RhdHVzOjAsc3RhdHVzVGV4dDplfSxlPSJmYWlsdXJlIjtkZWZhdWx0OnJbZV0uYXBwbHkocixbdCxuXSl9fX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSIsInF1ZXJ5c3RyaW5nLXN0cmluZ2lmeS1zaW1wbGUiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgianNvbi1wYXJzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbmZpZy5nbG9iYWwuSlNPTjtlLm5hbWVzcGFjZSgiSlNPTiIpLnBhcnNlPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gbi5wYXJzZSh0eXBlb2YgZT09InN0cmluZyI/ZTplKyIiLHQscil9fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ0cmFuc2l0aW9uIixmdW5jdGlvbihlLHQpe3ZhciBuPSIiLHI9IiIsaT1lLmNvbmZpZy5kb2Mscz0iZG9jdW1lbnRFbGVtZW50IixvPWlbc10uc3R5bGUsdT0idHJhbnNpdGlvbiIsYT0idHJhbnNpdGlvblByb3BlcnR5IixmLGwsYyxoLHAsZCx2PXt9LG09WyJXZWJraXQiLCJNb3oiXSxnPXtXZWJraXQ6IndlYmtpdFRyYW5zaXRpb25FbmQifSx5PWZ1bmN0aW9uKCl7dGhpcy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX07eS5fVFJBTlNGT1JNPSJ0cmFuc2Zvcm0iLHkuX3RvQ2FtZWw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKC8tKFthLXpdKS9naSxmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9KSxlfSx5Ll90b0h5cGhlbj1mdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoLyhbQS1aXT8pKFthLXpdKykoW0EtWl0/KS9nLGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPSh0PyItIit0LnRvTG93ZXJDYXNlKCk6IiIpK247cmV0dXJuIHImJihpKz0iLSIrci50b0xvd2VyQ2FzZSgpKSxpfSksZX0seS5TSE9XX1RSQU5TSVRJT049ImZhZGVJbiIseS5ISURFX1RSQU5TSVRJT049ImZhZGVPdXQiLHkudXNlTmF0aXZlPSExLCJ0cmFuc2l0aW9uImluIG8mJiJ0cmFuc2l0aW9uUHJvcGVydHkiaW4gbyYmInRyYW5zaXRpb25EdXJhdGlvbiJpbiBvJiYidHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uImluIG8mJiJ0cmFuc2l0aW9uRGVsYXkiaW4gbz8oeS51c2VOYXRpdmU9ITAseS5zdXBwb3J0ZWQ9ITApOmUuQXJyYXkuZWFjaChtLGZ1bmN0aW9uKGUpe3ZhciB0PWUrIlRyYW5zaXRpb24iO3QgaW4gaVtzXS5zdHlsZSYmKG49ZSxyPXkuX3RvSHlwaGVuKGUpKyItIix5LnVzZU5hdGl2ZT0hMCx5LnN1cHBvcnRlZD0hMCx5Ll9WRU5ET1JfUFJFRklYPWUpfSksdHlwZW9mIG8udHJhbnNmb3JtPT0idW5kZWZpbmVkIiYmZS5BcnJheS5lYWNoKG0sZnVuY3Rpb24oZSl7dmFyIHQ9ZSsiVHJhbnNmb3JtIjt0eXBlb2Ygb1t0XSE9InVuZGVmaW5lZCImJih5Ll9UUkFOU0ZPUk09dCl9KSxuJiYodT1uKyJUcmFuc2l0aW9uIixhPW4rIlRyYW5zaXRpb25Qcm9wZXJ0eSIpLGY9cisidHJhbnNpdGlvbi1wcm9wZXJ0eSIsbD1yKyJ0cmFuc2l0aW9uLWR1cmF0aW9uIixjPXIrInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIixoPXIrInRyYW5zaXRpb24tZGVsYXkiLHA9InRyYW5zaXRpb25lbmQiLGQ9Im9uIituLnRvTG93ZXJDYXNlKCkrInRyYW5zaXRpb25lbmQiLHA9Z1tuXXx8cCx5LmZ4PXt9LHkudG9nZ2xlcz17fSx5Ll9oYXNFbmQ9e30seS5fcmVLZXl3b3Jkcz0vXig/Om5vZGV8ZHVyYXRpb258aXRlcmF0aW9uc3xlYXNpbmd8ZGVsYXl8b258b25zdGFydHxvbmVuZCkkL2ksZS5Ob2RlLkRPTV9FVkVOVFNbcF09MSx5Lk5BTUU9InRyYW5zaXRpb24iLHkuREVGQVVMVF9FQVNJTkc9ImVhc2UiLHkuREVGQVVMVF9EVVJBVElPTj0uNSx5LkRFRkFVTFRfREVMQVk9MCx5Ll9ub2RlQXR0cnM9e30seS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnksaW5pdDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIG4uX25vZGU9ZSwhbi5fcnVubmluZyYmdCYmKG4uX2NvbmZpZz10LGUuX3RyYW5zaXRpb249bixuLl9kdXJhdGlvbj0iZHVyYXRpb24iaW4gdD90LmR1cmF0aW9uOm4uY29uc3RydWN0b3IuREVGQVVMVF9EVVJBVElPTixuLl9kZWxheT0iZGVsYXkiaW4gdD90LmRlbGF5Om4uY29uc3RydWN0b3IuREVGQVVMVF9ERUxBWSxuLl9lYXNpbmc9dC5lYXNpbmd8fG4uY29uc3RydWN0b3IuREVGQVVMVF9FQVNJTkcsbi5fY291bnQ9MCxuLl9ydW5uaW5nPSExKSxufSxhZGRQcm9wZXJ0eTpmdW5jdGlvbih0LG4pe3ZhciByPXRoaXMsaT10aGlzLl9ub2RlLHM9ZS5zdGFtcChpKSxvPWUub25lKGkpLHU9eS5fbm9kZUF0dHJzW3NdLGEsZixsLGMsaDt1fHwodT15Ll9ub2RlQXR0cnNbc109e30pLGM9dVt0XSxuJiZuLnZhbHVlIT09dW5kZWZpbmVkP2g9bi52YWx1ZTpuIT09dW5kZWZpbmVkJiYoaD1uLG49diksdHlwZW9mIGg9PSJmdW5jdGlvbiImJihoPWguY2FsbChvLG8pKSxjJiZjLnRyYW5zaXRpb24mJmMudHJhbnNpdGlvbiE9PXImJmMudHJhbnNpdGlvbi5fY291bnQtLSxyLl9jb3VudCsrLGw9KHR5cGVvZiBuLmR1cmF0aW9uIT0idW5kZWZpbmVkIj9uLmR1cmF0aW9uOnIuX2R1cmF0aW9uKXx8MWUtNCx1W3RdPXt2YWx1ZTpoLGR1cmF0aW9uOmwsZGVsYXk6dHlwZW9mIG4uZGVsYXkhPSJ1bmRlZmluZWQiP24uZGVsYXk6ci5fZGVsYXksZWFzaW5nOm4uZWFzaW5nfHxyLl9lYXNpbmcsdHJhbnNpdGlvbjpyfSxhPWUuRE9NLmdldENvbXB1dGVkU3R5bGUoaSx0KSxmPXR5cGVvZiBoPT0ic3RyaW5nIj9hOnBhcnNlRmxvYXQoYSkseS51c2VOYXRpdmUmJmY9PT1oJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5fb25OYXRpdmVFbmQuY2FsbChpLHtwcm9wZXJ0eU5hbWU6dCxlbGFwc2VkVGltZTpsfSl9LGwqMWUzKX0scmVtb3ZlUHJvcGVydHk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPXkuX25vZGVBdHRyc1tlLnN0YW1wKG4uX25vZGUpXTtyJiZyW3RdJiYoZGVsZXRlIHJbdF0sbi5fY291bnQtLSl9LGluaXRBdHRyczpmdW5jdGlvbih0KXt2YXIgbixyPXRoaXMuX25vZGU7dC50cmFuc2Zvcm0mJiF0W3kuX1RSQU5TRk9STV0mJih0W3kuX1RSQU5TRk9STV09dC50cmFuc2Zvcm0sZGVsZXRlIHQudHJhbnNmb3JtKTtmb3IobiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJiF5Ll9yZUtleXdvcmRzLnRlc3QobikmJih0aGlzLmFkZFByb3BlcnR5KG4sdFtuXSksci5zdHlsZVtuXT09PSIiJiZlLkRPTS5zZXRTdHlsZShyLG4sZS5ET00uZ2V0Q29tcHV0ZWRTdHlsZShyLG4pKSl9LHJ1bjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9bi5fbm9kZSxpPW4uX2NvbmZpZyxzPXt0eXBlOiJ0cmFuc2l0aW9uOnN0YXJ0Iixjb25maWc6aX07cmV0dXJuIG4uX3J1bm5pbmd8fChuLl9ydW5uaW5nPSEwLGkub24mJmkub24uc3RhcnQmJmkub24uc3RhcnQuY2FsbChlLm9uZShyKSxzKSxuLmluaXRBdHRycyhuLl9jb25maWcpLG4uX2NhbGxiYWNrPXQsbi5fc3RhcnQoKSksbn0sX3N0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcnVuTmF0aXZlKCl9LF9wcmVwRHVyOmZ1bmN0aW9uKGUpe3JldHVybiBlPXBhcnNlRmxvYXQoZSkqMWUzLGUrIm1zIn0sX3J1bk5hdGl2ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj10Ll9ub2RlLHI9ZS5zdGFtcChuKSxpPW4uc3R5bGUscz1uLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShuKSxvPXkuX25vZGVBdHRyc1tyXSx1PSIiLGE9c1t5Ll90b0NhbWVsKGYpXSxkPWYrIjogIix2PWwrIjogIixtPWMrIjogIixnPWgrIjogIixiLHcsRTthIT09ImFsbCImJihkKz1hKyIsIix2Kz1zW3kuX3RvQ2FtZWwobCldKyIsIixtKz1zW3kuX3RvQ2FtZWwoYyldKyIsIixnKz1zW3kuX3RvQ2FtZWwoaCldKyIsIik7Zm9yKEUgaW4gbyliPXkuX3RvSHlwaGVuKEUpLHc9b1tFXSwodz1vW0VdKSYmdy50cmFuc2l0aW9uPT09dCYmKEUgaW4gbi5zdHlsZT8odis9dC5fcHJlcER1cih3LmR1cmF0aW9uKSsiLCIsZys9dC5fcHJlcER1cih3LmRlbGF5KSsiLCIsbSs9dy5lYXNpbmcrIiwiLGQrPWIrIiwiLHUrPWIrIjogIit3LnZhbHVlKyI7ICIpOnRoaXMucmVtb3ZlUHJvcGVydHkoRSkpO2Q9ZC5yZXBsYWNlKC8sJC8sIjsiKSx2PXYucmVwbGFjZSgvLCQvLCI7IiksbT1tLnJlcGxhY2UoLywkLywiOyIpLGc9Zy5yZXBsYWNlKC8sJC8sIjsiKSx5Ll9oYXNFbmRbcl18fChuLmFkZEV2ZW50TGlzdGVuZXIocCx0Ll9vbk5hdGl2ZUVuZCwiIikseS5faGFzRW5kW3JdPSEwKSxpLmNzc1RleHQrPWQrdittK2crdX0sX2VuZDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9bi5fbm9kZSxpPW4uX2NhbGxiYWNrLHM9bi5fY29uZmlnLG89e3R5cGU6InRyYW5zaXRpb246ZW5kIixjb25maWc6cyxlbGFwc2VkVGltZTp0fSx1PWUub25lKHIpO24uX3J1bm5pbmc9ITEsbi5fY2FsbGJhY2s9bnVsbCxyJiYocy5vbiYmcy5vbi5lbmQ/c2V0VGltZW91dChmdW5jdGlvbigpe3Mub24uZW5kLmNhbGwodSxvKSxpJiZpLmNhbGwodSxvKX0sMSk6aSYmc2V0VGltZW91dChmdW5jdGlvbigpe2kuY2FsbCh1LG8pfSwxKSl9LF9lbmROYXRpdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZSxuPXQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsIiIpW3kuX3RvQ2FtZWwoZildO2U9eS5fdG9IeXBoZW4oZSksdHlwZW9mIG49PSJzdHJpbmciJiYobj1uLnJlcGxhY2UobmV3IFJlZ0V4cCgiKD86XnwsXFxzKSIrZSsiLD8iKSwiLCIpLG49bi5yZXBsYWNlKC9eLHwsJC8sIiIpLHQuc3R5bGVbdV09bil9LF9vbk5hdGl2ZUVuZDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9ZS5zdGFtcChuKSxpPXQscz15Ll90b0NhbWVsKGkucHJvcGVydHlOYW1lKSxvPWkuZWxhcHNlZFRpbWUsdT15Ll9ub2RlQXR0cnNbcl0sZj11W3NdLGw9Zj9mLnRyYW5zaXRpb246bnVsbCxjLGg7bCYmKGwucmVtb3ZlUHJvcGVydHkocyksbC5fZW5kTmF0aXZlKHMpLGg9bC5fY29uZmlnW3NdLGM9e3R5cGU6InByb3BlcnR5RW5kIixwcm9wZXJ0eU5hbWU6cyxlbGFwc2VkVGltZTpvLGNvbmZpZzpofSxoJiZoLm9uJiZoLm9uLmVuZCYmaC5vbi5lbmQuY2FsbChlLm9uZShuKSxjKSxsLl9jb3VudDw9MCYmKGwuX2VuZChvKSxuLnN0eWxlW2FdPSIiKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS5fbm9kZTt0JiYodC5yZW1vdmVFdmVudExpc3RlbmVyKHAsZS5fb25OYXRpdmVFbmQsITEpLGUuX25vZGU9bnVsbCl9fSxlLlRyYW5zaXRpb249eSxlLlRyYW5zaXRpb25OYXRpdmU9eSxlLk5vZGUucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXkuX25vZGVBdHRyc1tlLnN0YW1wKHRoaXMuX25vZGUpXSxzPWk/aS50cmFuc2l0aW9ufHxudWxsOm51bGwsbyx1O2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7dHlwZW9mIG49PSJmdW5jdGlvbiImJihyPW4sbj1udWxsKSxvPXkuZnhbdF07aWYobiYmdHlwZW9mIG49PSJvYmplY3QiKXtuPWUuY2xvbmUobik7Zm9yKHUgaW4gbylvLmhhc093blByb3BlcnR5KHUpJiYodSBpbiBufHwoblt1XT1vW3VdKSl9ZWxzZSBuPW99ZWxzZSByPW4sbj10O3JldHVybiBzJiYhcy5fcnVubmluZz9zLmluaXQodGhpcyxuKTpzPW5ldyB5KHRoaXMuX25vZGUsbikscy5ydW4ociksdGhpc30sZS5Ob2RlLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5fc2hvdygpLHQmJmUuVHJhbnNpdGlvbiYmKHR5cGVvZiB0IT0ic3RyaW5nIiYmIXQucHVzaCYmKHR5cGVvZiBuPT0iZnVuY3Rpb24iJiYocj1uLG49dCksdD15LlNIT1dfVFJBTlNJVElPTiksdGhpcy50cmFuc2l0aW9uKHQsbixyKSksdGhpc30sZS5Ob2RlTGlzdC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5fbm9kZXMscz0wLG87d2hpbGUobz1pW3MrK10pZS5vbmUobykuc2hvdyh0LG4scik7cmV0dXJuIHRoaXN9O3ZhciBiPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0JiZ0LmNhbGwoZSksbiYmdHlwZW9mIG49PSJmdW5jdGlvbiImJm4uYXBwbHkoZS5fbm9kZSxhcmd1bWVudHMpfX07ZS5Ob2RlLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdCYmZS5UcmFuc2l0aW9uPyh0eXBlb2Ygbj09ImZ1bmN0aW9uIiYmKHI9bixuPW51bGwpLHI9Yih0aGlzLHRoaXMuX2hpZGUsciksdHlwZW9mIHQhPSJzdHJpbmciJiYhdC5wdXNoJiYodHlwZW9mIG49PSJmdW5jdGlvbiImJihyPW4sbj10KSx0PXkuSElERV9UUkFOU0lUSU9OKSx0aGlzLnRyYW5zaXRpb24odCxuLHIpKTp0aGlzLl9oaWRlKCksdGhpc30sZS5Ob2RlTGlzdC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5fbm9kZXMscz0wLG87d2hpbGUobz1pW3MrK10pZS5vbmUobykuaGlkZSh0LG4scik7cmV0dXJuIHRoaXN9LGUuTm9kZUxpc3QucHJvdG90eXBlCi50cmFuc2l0aW9uPWZ1bmN0aW9uKHQsbixyKXt2YXIgaT10aGlzLl9ub2RlcyxzPXRoaXMuc2l6ZSgpLG89MCxyPXI9PT0hMCx1O3doaWxlKHU9aVtvKytdKW88cyYmcj9lLm9uZSh1KS50cmFuc2l0aW9uKHQpOmUub25lKHUpLnRyYW5zaXRpb24odCxuKTtyZXR1cm4gdGhpc30sZS5Ob2RlLnByb3RvdHlwZS50b2dnbGVWaWV3PWZ1bmN0aW9uKHQsbixyKXt0aGlzLl90b2dnbGVzPXRoaXMuX3RvZ2dsZXN8fFtdLHI9YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV07aWYodHlwZW9mIHQhPSJzdHJpbmciKXtuPXQsdGhpcy5fdG9nZ2xlVmlldyhuLHIpO3JldHVybn1yZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiImJihuPXVuZGVmaW5lZCksdHlwZW9mIG49PSJ1bmRlZmluZWQiJiZ0IGluIHRoaXMuX3RvZ2dsZXMmJihuPSF0aGlzLl90b2dnbGVzW3RdKSxuPW4/MTowLG4/dGhpcy5fc2hvdygpOnI9Yih0aGlzLHRoaXMuX2hpZGUsciksdGhpcy5fdG9nZ2xlc1t0XT1uLHRoaXMudHJhbnNpdGlvbihlLlRyYW5zaXRpb24udG9nZ2xlc1t0XVtuXSxyKSx0aGlzfSxlLk5vZGVMaXN0LnByb3RvdHlwZS50b2dnbGVWaWV3PWZ1bmN0aW9uKHQsbixyKXt2YXIgaT10aGlzLl9ub2RlcyxzPTAsbzt3aGlsZShvPWlbcysrXSlvPWUub25lKG8pLG8udG9nZ2xlVmlldy5hcHBseShvLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGUubWl4KHkuZngse2ZhZGVPdXQ6e29wYWNpdHk6MCxkdXJhdGlvbjouNSxlYXNpbmc6ImVhc2Utb3V0In0sZmFkZUluOntvcGFjaXR5OjEsZHVyYXRpb246LjUsZWFzaW5nOiJlYXNlLWluIn0sc2l6ZU91dDp7aGVpZ2h0OjAsd2lkdGg6MCxkdXJhdGlvbjouNzUsZWFzaW5nOiJlYXNlLW91dCJ9LHNpemVJbjp7aGVpZ2h0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgic2Nyb2xsSGVpZ2h0IikrInB4In0sd2lkdGg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJzY3JvbGxXaWR0aCIpKyJweCJ9LGR1cmF0aW9uOi41LGVhc2luZzoiZWFzZS1pbiIsb246e3N0YXJ0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTdHlsZSgib3ZlcmZsb3ciKTtlIT09ImhpZGRlbiImJih0aGlzLnNldFN0eWxlKCJvdmVyZmxvdyIsImhpZGRlbiIpLHRoaXMuX3RyYW5zaXRpb25PdmVyZmxvdz1lKX0sZW5kOmZ1bmN0aW9uKCl7dGhpcy5fdHJhbnNpdGlvbk92ZXJmbG93JiYodGhpcy5zZXRTdHlsZSgib3ZlcmZsb3ciLHRoaXMuX3RyYW5zaXRpb25PdmVyZmxvdyksZGVsZXRlIHRoaXMuX3RyYW5zaXRpb25PdmVyZmxvdyl9fX19KSxlLm1peCh5LnRvZ2dsZXMse3NpemU6WyJzaXplT3V0Iiwic2l6ZUluIl0sZmFkZTpbImZhZGVPdXQiLCJmYWRlSW4iXX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJub2RlLXN0eWxlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInNlbGVjdG9yLWNzczIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49InBhcmVudE5vZGUiLHI9InRhZ05hbWUiLGk9ImF0dHJpYnV0ZXMiLHM9ImNvbWJpbmF0b3IiLG89InBzZXVkb3MiLHU9ZS5TZWxlY3RvcixhPXtfcmVSZWdFeHBUb2tlbnM6LyhbXF5cJFw/XFtcXVwqXCtcLVwuXChcKVx8XFxdKS8sU09SVF9SRVNVTFRTOiEwLF9pc1hNTDpmdW5jdGlvbigpe3ZhciB0PWUuY29uZmlnLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKS50YWdOYW1lIT09IkRJViI7cmV0dXJuIHR9KCksc2hvcnRoYW5kOnsiXFwjKC0/W19hLXowLTldK1stXFx3XFx1RTAwMF0qKSI6IltpZD0kMV0iLCJcXC4oLT9bX2Etel0rWy1cXHdcXHVFMDAwXSopIjoiW2NsYXNzTmFtZX49JDFdIn0sb3BlcmF0b3JzOnsiIjpmdW5jdGlvbih0LG4pe3JldHVybiBlLkRPTS5nZXRBdHRyaWJ1dGUodCxuKSE9PSIifSwifj0iOiIoPzpefFxccyspe3ZhbH0oPzpcXHMrfCQpIiwifD0iOiJee3ZhbH0tPyJ9LHBzZXVkb3M6eyJmaXJzdC1jaGlsZCI6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLl9jaGlsZHJlbih0W25dKVswXT09PXR9fSxfYnJ1dGVRdWVyeTpmdW5jdGlvbih0LG4scil7dmFyIGk9W10scz1bXSxvLGE9dS5fdG9rZW5pemUodCksZj1hW2EubGVuZ3RoLTFdLGw9ZS5ET00uX2dldERvYyhuKSxjLGgscCxkLHY7aWYoZil7aD1mLmlkLHA9Zi5jbGFzc05hbWUsZD1mLnRhZ05hbWV8fCIqIjtpZihuLmdldEVsZW1lbnRzQnlUYWdOYW1lKWgmJihuLmFsbHx8bi5ub2RlVHlwZT09PTl8fGUuRE9NLmluRG9jKG4pKT9zPWUuRE9NLmFsbEJ5SWQoaCxuKTpwP3M9bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHApOnM9bi5nZXRFbGVtZW50c0J5VGFnTmFtZShkKTtlbHNle289W10sYz1uLmZpcnN0Q2hpbGQsdj1kPT09IioiO3doaWxlKGMpe3doaWxlKGMpYy50YWdOYW1lPiJAIiYmKHZ8fGMudGFnTmFtZT09PWQpJiZzLnB1c2goYyksby5wdXNoKGMpLGM9Yy5maXJzdENoaWxkO3doaWxlKG8ubGVuZ3RoPjAmJiFjKWM9by5wb3AoKS5uZXh0U2libGluZ319cy5sZW5ndGgmJihpPXUuX2ZpbHRlck5vZGVzKHMsYSxyKSl9cmV0dXJuIGl9LF9maWx0ZXJOb2RlczpmdW5jdGlvbih0LG4scil7dmFyIGk9MCxzLG89bi5sZW5ndGgsYT1vLTEsZj1bXSxsPXRbMF0sYz1sLGg9ZS5TZWxlY3Rvci5nZXR0ZXJzLHAsZCx2LG0sZyx5LGIsdztmb3IoaT0wO2M9bD10W2krK107KXthPW8tMSxtPW51bGw7ZTp3aGlsZShjJiZjLnRhZ05hbWUpe3Y9blthXSxiPXYudGVzdHMscz1iLmxlbmd0aDtpZihzJiYhZyl3aGlsZSh3PWJbLS1zXSl7cD13WzFdLGhbd1swXV0/eT1oW3dbMF1dKGMsd1swXSk6KHk9Y1t3WzBdXSx3WzBdPT09InRhZ05hbWUiJiYhdS5faXNYTUwmJih5PXkudG9VcHBlckNhc2UoKSksdHlwZW9mIHkhPSJzdHJpbmciJiZ5IT09dW5kZWZpbmVkJiZ5LnRvU3RyaW5nP3k9eS50b1N0cmluZygpOnk9PT11bmRlZmluZWQmJmMuZ2V0QXR0cmlidXRlJiYoeT1jLmdldEF0dHJpYnV0ZSh3WzBdLDIpKSk7aWYocD09PSI9IiYmeSE9PXdbMl18fHR5cGVvZiBwIT0ic3RyaW5nIiYmcC50ZXN0JiYhcC50ZXN0KHkpfHwhcC50ZXN0JiZ0eXBlb2YgcD09ImZ1bmN0aW9uIiYmIXAoYyx3WzBdLHdbMl0pKXtpZihjPWNbbV0pd2hpbGUoYyYmKCFjLnRhZ05hbWV8fHYudGFnTmFtZSYmdi50YWdOYW1lIT09Yy50YWdOYW1lKSljPWNbbV07Y29udGludWUgZX19YS0tO2lmKCEhZ3x8IShkPXYuY29tYmluYXRvcikpe2YucHVzaChsKTtpZihyKXJldHVybiBmO2JyZWFrfW09ZC5heGlzLGM9Y1ttXTt3aGlsZShjJiYhYy50YWdOYW1lKWM9Y1ttXTtkLmRpcmVjdCYmKG09bnVsbCl9fXJldHVybiBsPWM9bnVsbCxmfSxjb21iaW5hdG9yczp7IiAiOntheGlzOiJwYXJlbnROb2RlIn0sIj4iOntheGlzOiJwYXJlbnROb2RlIixkaXJlY3Q6ITB9LCIrIjp7YXhpczoicHJldmlvdXNTaWJsaW5nIixkaXJlY3Q6ITB9fSxfcGFyc2Vyczpbe25hbWU6aSxyZTovXlx1RTAwMygtP1thLXpdK1tcd1wtXSopKyhbflx8XF5cJFwqIT1dPT8pP1snIl0/KFteXHVFMDA0JyJdKilbJyJdP1x1RTAwNC9pLGZuOmZ1bmN0aW9uKHQsbil7dmFyIHI9dFsyXXx8IiIsaT11Lm9wZXJhdG9ycyxzPXRbM10/dFszXS5yZXBsYWNlKC9cXC9nLCIiKToiIixvO2lmKHRbMV09PT0iaWQiJiZyPT09Ij0ifHx0WzFdPT09ImNsYXNzTmFtZSImJmUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmKHI9PT0ifj0ifHxyPT09Ij0iKSluLnByZWZpbHRlcj10WzFdLHRbM109cyxuW3RbMV1dPXRbMV09PT0iaWQiP3RbM106cztyIGluIGkmJihvPWlbcl0sdHlwZW9mIG89PSJzdHJpbmciJiYodFszXT1zLnJlcGxhY2UodS5fcmVSZWdFeHBUb2tlbnMsIlxcJDEiKSxvPW5ldyBSZWdFeHAoby5yZXBsYWNlKCJ7dmFsfSIsdFszXSkpKSx0WzJdPW8pO2lmKCFuLmxhc3R8fG4ucHJlZmlsdGVyIT09dFsxXSlyZXR1cm4gdC5zbGljZSgxKX19LHtuYW1lOnIscmU6L14oKD86LT9bX2Etel0rW1x3LV0qKXxcKikvaSxmbjpmdW5jdGlvbihlLHQpe3ZhciBuPWVbMV07dS5faXNYTUx8fChuPW4udG9VcHBlckNhc2UoKSksdC50YWdOYW1lPW47aWYobiE9PSIqIiYmKCF0Lmxhc3R8fHQucHJlZmlsdGVyKSlyZXR1cm5bciwiPSIsbl07dC5wcmVmaWx0ZXJ8fCh0LnByZWZpbHRlcj0idGFnTmFtZSIpfX0se25hbWU6cyxyZTovXlxzKihbPit+XXxccylccyovLGZuOmZ1bmN0aW9uKGUsdCl7fX0se25hbWU6byxyZTovXjooW1wtXHddKykoPzpcdUUwMDVbJyJdPyhbXlx1RTAwNV0qKVsnIl0/XHVFMDA2KSovaSxmbjpmdW5jdGlvbihlLHQpe3ZhciBuPXVbb11bZVsxXV07cmV0dXJuIG4/KGVbMl0mJihlWzJdPWVbMl0ucmVwbGFjZSgvXFwvZywiIikpLFtlWzJdLG5dKTohMX19XSxfZ2V0VG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJue3RhZ05hbWU6bnVsbCxpZDpudWxsLGNsYXNzTmFtZTpudWxsLGF0dHJpYnV0ZXM6e30sY29tYmluYXRvcjpudWxsLHRlc3RzOltdfX0sX3Rva2VuaXplOmZ1bmN0aW9uKHQpe3Q9dHx8IiIsdD11Ll9wYXJzZVNlbGVjdG9yKGUuTGFuZy50cmltKHQpKTt2YXIgbj11Ll9nZXRUb2tlbigpLHI9dCxpPVtdLG89ITEsYSxmLGwsYztlOmRve289ITE7Zm9yKGw9MDtjPXUuX3BhcnNlcnNbbCsrXTspaWYoYT1jLnJlLmV4ZWModCkpe2MubmFtZSE9PXMmJihuLnNlbGVjdG9yPXQpLHQ9dC5yZXBsYWNlKGFbMF0sIiIpLHQubGVuZ3RofHwobi5sYXN0PSEwKSx1Ll9hdHRyRmlsdGVyc1thWzFdXSYmKGFbMV09dS5fYXR0ckZpbHRlcnNbYVsxXV0pLGY9Yy5mbihhLG4pO2lmKGY9PT0hMSl7bz0hMTticmVhayBlfWYmJm4udGVzdHMucHVzaChmKTtpZighdC5sZW5ndGh8fGMubmFtZT09PXMpaS5wdXNoKG4pLG49dS5fZ2V0VG9rZW4obiksYy5uYW1lPT09cyYmKG4uY29tYmluYXRvcj1lLlNlbGVjdG9yLmNvbWJpbmF0b3JzW2FbMV1dKTtvPSEwfX13aGlsZShvJiZ0Lmxlbmd0aCk7aWYoIW98fHQubGVuZ3RoKWk9W107cmV0dXJuIGl9LF9yZXBsYWNlTWFya2VyczpmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoL1xbL2csIlx1ZTAwMyIpLGU9ZS5yZXBsYWNlKC9cXS9nLCJcdWUwMDQiKSxlPWUucmVwbGFjZSgvXCgvZywiXHVlMDA1IiksZT1lLnJlcGxhY2UoL1wpL2csIlx1ZTAwNiIpLGV9LF9yZXBsYWNlU2hvcnRoYW5kOmZ1bmN0aW9uKHQpe3ZhciBuPWUuU2VsZWN0b3Iuc2hvcnRoYW5kLHI7Zm9yKHIgaW4gbiluLmhhc093blByb3BlcnR5KHIpJiYodD10LnJlcGxhY2UobmV3IFJlZ0V4cChyLCJnaSIpLG5bcl0pKTtyZXR1cm4gdH0sX3BhcnNlU2VsZWN0b3I6ZnVuY3Rpb24odCl7dmFyIG49ZS5TZWxlY3Rvci5fcmVwbGFjZVNlbGVjdG9yKHQpLHQ9bi5zZWxlY3RvcjtyZXR1cm4gdD1lLlNlbGVjdG9yLl9yZXBsYWNlU2hvcnRoYW5kKHQpLHQ9ZS5TZWxlY3Rvci5fcmVzdG9yZSgiYXR0ciIsdCxuLmF0dHJzKSx0PWUuU2VsZWN0b3IuX3Jlc3RvcmUoInBzZXVkbyIsdCxuLnBzZXVkb3MpLHQ9ZS5TZWxlY3Rvci5fcmVwbGFjZU1hcmtlcnModCksdD1lLlNlbGVjdG9yLl9yZXN0b3JlKCJlc2MiLHQsbi5lc2MpLHR9LF9hdHRyRmlsdGVyczp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGdldHRlcnM6e2hyZWY6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5ET00uZ2V0QXR0cmlidXRlKHQsbil9LGlkOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuRE9NLmdldElkKHQpfX19O2UubWl4KGUuU2VsZWN0b3IsYSwhMCksZS5TZWxlY3Rvci5nZXR0ZXJzLnNyYz1lLlNlbGVjdG9yLmdldHRlcnMucmVsPWUuU2VsZWN0b3IuZ2V0dGVycy5ocmVmLGUuU2VsZWN0b3IudXNlTmF0aXZlJiZlLmNvbmZpZy5kb2MucXVlcnlTZWxlY3RvciYmKGUuU2VsZWN0b3Iuc2hvcnRoYW5kWyJcXC4oLT9bX2Etel0rWy1cXHddKikiXT0iW2NsYXNzfj0kMV0iKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsic2VsZWN0b3ItbmF0aXZlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInNlbGVjdG9yLWNzczMiLGZ1bmN0aW9uKGUsdCl7ZS5TZWxlY3Rvci5fcmVOdGg9L14oPzooW1wtXT9cZCopKG4pezF9fChvZGR8ZXZlbikkKSooW1wtK10/XGQqKSQvLGUuU2VsZWN0b3IuX2dldE50aD1mdW5jdGlvbih0LG4scixpKXtlLlNlbGVjdG9yLl9yZU50aC50ZXN0KG4pO3ZhciBzPXBhcnNlSW50KFJlZ0V4cC4kMSwxMCksbz1SZWdFeHAuJDIsdT1SZWdFeHAuJDMsYT1wYXJzZUludChSZWdFeHAuJDQsMTApfHwwLGY9W10sbD1lLkRPTS5fY2hpbGRyZW4odC5wYXJlbnROb2RlLHIpLGM7dT8ocz0yLGM9IisiLG89Im4iLGE9dT09PSJvZGQiPzE6MCk6aXNOYU4ocykmJihzPW8/MTowKTtpZihzPT09MClyZXR1cm4gaSYmKGE9bC5sZW5ndGgtYSsxKSxsW2EtMV09PT10PyEwOiExO3M8MCYmKGk9ISFpLHM9TWF0aC5hYnMocykpO2lmKCFpKXtmb3IodmFyIGg9YS0xLHA9bC5sZW5ndGg7aDxwO2grPXMpaWYoaD49MCYmbFtoXT09PXQpcmV0dXJuITB9ZWxzZSBmb3IodmFyIGg9bC5sZW5ndGgtYSxwPWwubGVuZ3RoO2g+PTA7aC09cylpZihoPHAmJmxbaF09PT10KXJldHVybiEwO3JldHVybiExfSxlLm1peChlLlNlbGVjdG9yLnBzZXVkb3Mse3Jvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1lLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fSwibnRoLWNoaWxkIjpmdW5jdGlvbih0LG4pe3JldHVybiBlLlNlbGVjdG9yLl9nZXROdGgodCxuKX0sIm50aC1sYXN0LWNoaWxkIjpmdW5jdGlvbih0LG4pe3JldHVybiBlLlNlbGVjdG9yLl9nZXROdGgodCxuLG51bGwsITApfSwibnRoLW9mLXR5cGUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuU2VsZWN0b3IuX2dldE50aCh0LG4sdC50YWdOYW1lKX0sIm50aC1sYXN0LW9mLXR5cGUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuU2VsZWN0b3IuX2dldE50aCh0LG4sdC50YWdOYW1lLCEwKX0sImxhc3QtY2hpbGQiOmZ1bmN0aW9uKHQpe3ZhciBuPWUuRE9NLl9jaGlsZHJlbih0LnBhcmVudE5vZGUpO3JldHVybiBuW24ubGVuZ3RoLTFdPT09dH0sImZpcnN0LW9mLXR5cGUiOmZ1bmN0aW9uKHQpe3JldHVybiBlLkRPTS5fY2hpbGRyZW4odC5wYXJlbnROb2RlLHQudGFnTmFtZSlbMF09PT10fSwibGFzdC1vZi10eXBlIjpmdW5jdGlvbih0KXt2YXIgbj1lLkRPTS5fY2hpbGRyZW4odC5wYXJlbnROb2RlLHQudGFnTmFtZSk7cmV0dXJuIG5bbi5sZW5ndGgtMV09PT10fSwib25seS1jaGlsZCI6ZnVuY3Rpb24odCl7dmFyIG49ZS5ET00uX2NoaWxkcmVuKHQucGFyZW50Tm9kZSk7cmV0dXJuIG4ubGVuZ3RoPT09MSYmblswXT09PXR9LCJvbmx5LW9mLXR5cGUiOmZ1bmN0aW9uKHQpe3ZhciBuPWUuRE9NLl9jaGlsZHJlbih0LnBhcmVudE5vZGUsdC50YWdOYW1lKTtyZXR1cm4gbi5sZW5ndGg9PT0xJiZuWzBdPT09dH0sZW1wdHk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hpbGROb2Rlcy5sZW5ndGg9PT0wfSxub3Q6ZnVuY3Rpb24odCxuKXtyZXR1cm4hZS5TZWxlY3Rvci50ZXN0KHQsbil9LGNvbnRhaW5zOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbm5lclRleHR8fGUudGV4dENvbnRlbnR8fCIiO3JldHVybiBuLmluZGV4T2YodCk+LTF9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hlY2tlZD09PSEwfHxlLnNlbGVjdGVkPT09ITB9LGVuYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQhPT11bmRlZmluZWQmJiFlLmRpc2FibGVkfSxkaXNhYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZH19KSxlLm1peChlLlNlbGVjdG9yLm9wZXJhdG9ycyx7Il49IjoiXnt2YWx9IiwiJD0iOiJ7dmFsfSQiLCIqPSI6Int2YWx9In0pLGUuU2VsZWN0b3IuY29tYmluYXRvcnNbIn4iXT17YXhpczoicHJldmlvdXNTaWJsaW5nIn19LCIzLjE3LjIiLHtyZXF1aXJlczpbInNlbGVjdG9yLW5hdGl2ZSIsInNlbGVjdG9yLWNzczIiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiZG9tLXN0eWxlLWllIixmdW5jdGlvbihlLHQpe3ZhciBuPSJoYXNMYXlvdXQiLHI9InB4IixpPSJmaWx0ZXIiLHM9ImZpbHRlcnMiLG89Im9wYWNpdHkiLHU9ImF1dG8iLGE9ImJvcmRlcldpZHRoIixmPSJib3JkZXJUb3BXaWR0aCIsbD0iYm9yZGVyUmlnaHRXaWR0aCIsYz0iYm9yZGVyQm90dG9tV2lkdGgiLGg9ImJvcmRlckxlZnRXaWR0aCIscD0id2lkdGgiLGQ9ImhlaWdodCIsdj0idHJhbnNwYXJlbnQiLG09InZpc2libGUiLGc9ImdldENvbXB1dGVkU3R5bGUiLHk9ZS5jb25maWcuZG9jLmRvY3VtZW50RWxlbWVudCxiPWUuRmVhdHVyZXMudGVzdCx3PWUuRmVhdHVyZXMuYWRkLEU9L14oXGRbLlxkXSopKyhlbXxleHxweHxnZHxyZW18dnd8dmh8dm18Y2h8bW18Y218aW58cHR8cGN8ZGVnfHJhZHxtc3xzfGh6fGtoenwlKXsxfT8vaSxTPWUuVUEuaWU+PTgseD1mdW5jdGlvbihlKXtyZXR1cm4gZS5jdXJyZW50U3R5bGV8fGUuc3R5bGV9LFQ9e0NVU1RPTV9TVFlMRVM6e30sZ2V0OmZ1bmN0aW9uKHQsbil7dmFyIGk9IiIscztyZXR1cm4gdCYmKHM9eCh0KVtuXSxuPT09byYmZS5ET00uQ1VTVE9NX1NUWUxFU1tvXT9pPWUuRE9NLkNVU1RPTV9TVFlMRVNbb10uZ2V0KHQpOiFzfHxzLmluZGV4T2YmJnMuaW5kZXhPZihyKT4tMT9pPXM6ZS5ET00uSUUuQ09NUFVURURbbl0/aT1lLkRPTS5JRS5DT01QVVRFRFtuXSh0LG4pOkUudGVzdChzKT9pPVQuZ2V0UGl4ZWwodCxuKStyOmk9cyksaX0sc2l6ZU9mZnNldHM6e3dpZHRoOlsiTGVmdCIsIlJpZ2h0Il0saGVpZ2h0OlsiVG9wIiwiQm90dG9tIl0sdG9wOlsiVG9wIl0sYm90dG9tOlsiQm90dG9tIl19LGdldE9mZnNldDpmdW5jdGlvbihlLHQpe3ZhciBuPXgoZSlbdF0saT10LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpLHM9InBpeGVsIitpLG89VC5zaXplT2Zmc2V0c1t0XSxhPWUub3duZXJEb2N1bWVudC5jb21wYXRNb2RlLGY9IiI7cmV0dXJuIG49PT11fHxuLmluZGV4T2YoIiUiKT4tMT8oZj1lWyJvZmZzZXQiK2ldLGEhPT0iQmFja0NvbXBhdCImJihvWzBdJiYoZi09VC5nZXRQaXhlbChlLCJwYWRkaW5nIitvWzBdKSxmLT1ULmdldEJvcmRlcldpZHRoKGUsImJvcmRlciIrb1swXSsiV2lkdGgiLDEpKSxvWzFdJiYoZi09VC5nZXRQaXhlbChlLCJwYWRkaW5nIitvWzFdKSxmLT1ULmdldEJvcmRlcldpZHRoKGUsImJvcmRlciIrb1sxXSsiV2lkdGgiLDEpKSkpOighZS5zdHlsZVtzXSYmIWUuc3R5bGVbdF0mJihlLnN0eWxlW3RdPW4pLGY9ZS5zdHlsZVtzXSksZityfSxib3JkZXJNYXA6e3RoaW46Uz8iMXB4IjoiMnB4IixtZWRpdW06Uz8iM3B4IjoiNHB4Iix0aGljazpTPyI1cHgiOiI2cHgifSxnZXRCb3JkZXJXaWR0aDpmdW5jdGlvbihlLHQsbil7dmFyIGk9ZS5jdXJyZW50U3R5bGVbdF07cmV0dXJuIGkuaW5kZXhPZihyKTwwJiYoVC5ib3JkZXJNYXBbaV0mJmUuY3VycmVudFN0eWxlLmJvcmRlclN0eWxlIT09Im5vbmUiP2k9VC5ib3JkZXJNYXBbaV06aT0wKSxuP3BhcnNlRmxvYXQoaSk6aX0sZ2V0UGl4ZWw6ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsLHI9eChlKSxpPXIucmlnaHQscz1yW3RdO3JldHVybiBlLnN0eWxlLnJpZ2h0PXMsbj1lLnN0eWxlLnBpeGVsUmlnaHQsZS5zdHlsZS5yaWdodD1pLG59LGdldE1hcmdpbjpmdW5jdGlvbihlLHQpe3ZhciBuLGk9eChlKTtyZXR1cm4gaVt0XT09PXU/bj0wOm49VC5nZXRQaXhlbChlLHQpLG4rcn0sZ2V0VmlzaWJpbGl0eTpmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKChuPWUuY3VycmVudFN0eWxlKSYmblt0XT09PSJpbmhlcml0IillPWUucGFyZW50Tm9kZTtyZXR1cm4gbj9uW3RdOm19LGdldENvbG9yOmZ1bmN0aW9uKHQsbil7dmFyIHI9eCh0KVtuXTtyZXR1cm4oIXJ8fHI9PT12KSYmZS5ET00uZWxlbWVudEJ5QXhpcyh0LCJwYXJlbnROb2RlIixudWxsLGZ1bmN0aW9uKGUpe3I9eChlKVtuXTtpZihyJiZyIT09dilyZXR1cm4gdD1lLCEwfSksZS5Db2xvci50b1JHQihyKX0sZ2V0Qm9yZGVyQ29sb3I6ZnVuY3Rpb24odCxuKXt2YXIgcj14KHQpLGk9cltuXXx8ci5jb2xvcjtyZXR1cm4gZS5Db2xvci50b1JHQihlLkNvbG9yLnRvSGV4KGkpKX19LE49e307dygic3R5bGUiLCJjb21wdXRlZFN0eWxlIix7dGVzdDpmdW5jdGlvbigpe3JldHVybiJnZXRDb21wdXRlZFN0eWxlImluIGUuY29uZmlnLndpbn19KSx3KCJzdHlsZSIsIm9wYWNpdHkiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIm9wYWNpdHkiaW4geS5zdHlsZX19KSx3KCJzdHlsZSIsImZpbHRlciIse3Rlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4iZmlsdGVycyJpbiB5fX0pLCFiKCJzdHlsZSIsIm9wYWNpdHkiKSYmYigic3R5bGUiLCJmaWx0ZXIiKSYmKGUuRE9NLkNVU1RPTV9TVFlMRVNbb109e2dldDpmdW5jdGlvbihlKXt2YXIgdD0xMDA7dHJ5e3Q9ZVtzXVsiRFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEiXVtvXX1jYXRjaChuKXt0cnl7dD1lW3NdKCJhbHBoYSIpW29dfWNhdGNoKHIpe319cmV0dXJuIHQvMTAwfSxzZXQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBzLHU9eChlKSxhPXVbaV07cj1yfHxlLnN0eWxlLHQ9PT0iIiYmKHM9byBpbiB1P3Vbb106MSx0PXMpLHR5cGVvZiBhPT0ic3RyaW5nIiYmKHJbaV09YS5yZXBsYWNlKC9hbHBoYShbXildKlwpKS9naSwiIikrKHQ8PTE/ImFscGhhKCIrbysiPSIrdCoxMDArIikiOiIiKSxyW2ldfHxyLnJlbW92ZUF0dHJpYnV0ZShpKSx1W25dfHwoci56b29tPTEpKX19KTt0cnl7ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLmhlaWdodD0iLTFweCJ9Y2F0Y2goQyl7ZS5ET00uQ1VTVE9NX1NUWUxFUy5oZWlnaHQ9e3NldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9cGFyc2VGbG9hdCh0KTtpZihyPj0wfHx0PT09ImF1dG8ifHx0PT09IiIpbi5oZWlnaHQ9dH19LGUuRE9NLkNVU1RPTV9TVFlMRVMud2lkdGg9e3NldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9cGFyc2VGbG9hdCh0KTtpZihyPj0wfHx0PT09ImF1dG8ifHx0PT09IiIpbi53aWR0aD10fX19Yigic3R5bGUiLCJjb21wdXRlZFN0eWxlIil8fChOW3BdPU5bZF09VC5nZXRPZmZzZXQsTi5jb2xvcj1OLmJhY2tncm91bmRDb2xvcj1ULmdldENvbG9yLE5bYV09TltmXT1OW2xdPU5bY109TltoXT1ULmdldEJvcmRlcldpZHRoLE4ubWFyZ2luVG9wPU4ubWFyZ2luUmlnaHQ9Ti5tYXJnaW5Cb3R0b209Ti5tYXJnaW5MZWZ0PVQuZ2V0TWFyZ2luLE4udmlzaWJpbGl0eT1ULmdldFZpc2liaWxpdHksTi5ib3JkZXJDb2xvcj1OLmJvcmRlclRvcENvbG9yPU4uYm9yZGVyUmlnaHRDb2xvcj1OLmJvcmRlckJvdHRvbUNvbG9yPU4uYm9yZGVyTGVmdENvbG9yPVQuZ2V0Qm9yZGVyQ29sb3IsZS5ET01bZ109VC5nZXQsZS5uYW1lc3BhY2UoIkRPTS5JRSIpLGUuRE9NLklFLkNPTVBVVEVEPU4sZS5ET00uSUUuQ29tcHV0ZWRTdHlsZT1UKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZG9tLXN0eWxlIiwiY29sb3ItYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJlc2NhcGUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImI3gyNzsiLCIvIjoiJiN4MkY7IiwiYCI6IiYjeDYwOyJ9LHI9e2h0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UoL1smPD4iJ1wvYF0vZyxyLl9odG1sUmVwbGFjZXIpfSxyZWdleDpmdW5jdGlvbihlKXtyZXR1cm4oZSsiIikucmVwbGFjZSgvW1wtJFxeKigpK1xbXF17fXxcXCwuP1xzXS9nLCJcXCQmIil9LF9odG1sUmVwbGFjZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV19fTtyLnJlZ2V4cD1yLnJlZ2V4LGUuRXNjYXBlPXJ9LCIzLjE3LjIiLHtyZXF1aXJlczpbInl1aS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImF0dHJpYnV0ZS1jb3JlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGIoZSx0LG4pe3RoaXMuX3l1aWV2dD1udWxsLHRoaXMuX2luaXRBdHRySG9zdChlLHQsbil9ZS5TdGF0ZT1mdW5jdGlvbigpe3RoaXMuZGF0YT17fX0sZS5TdGF0ZS5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5kYXRhW2VdO3J8fChyPXRoaXMuZGF0YVtlXT17fSksclt0XT1ufSxhZGRBbGw6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmRhdGFbZV0scjtufHwobj10aGlzLmRhdGFbZV09e30pO2ZvcihyIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09dFtyXSl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZGF0YVtlXTtuJiZkZWxldGUgblt0XX0scmVtb3ZlQWxsOmZ1bmN0aW9uKHQsbil7dmFyIHI7bj9lLmVhY2gobixmdW5jdGlvbihlLG4pe3RoaXMucmVtb3ZlKHQsdHlwZW9mIG49PSJzdHJpbmciP246ZSl9LHRoaXMpOihyPXRoaXMuZGF0YSx0IGluIHImJmRlbGV0ZSByW3RdKX0sZ2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5kYXRhW2VdO2lmKG4pcmV0dXJuIG5bdF19LGdldEFsbDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZGF0YVtlXSxyLGk7aWYodClpPW47ZWxzZSBpZihuKXtpPXt9O2ZvcihyIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShyKSYmKGlbcl09bltyXSl9cmV0dXJuIGl9fTt2YXIgbj1lLk9iamVjdCxyPWUuTGFuZyxpPSIuIixzPSJnZXR0ZXIiLG89InNldHRlciIsdT0icmVhZE9ubHkiLGE9IndyaXRlT25jZSIsZj0iaW5pdE9ubHkiLGw9InZhbGlkYXRvciIsYz0idmFsdWUiLGg9InZhbHVlRm4iLHA9ImxhenlBZGQiLGQ9ImFkZGVkIix2PSJfYnlwYXNzUHJveHkiLG09ImluaXRWYWx1ZSIsZz0ibGF6eSIseTtiLklOVkFMSURfVkFMVUU9e30seT1iLklOVkFMSURfVkFMVUUsYi5fQVRUUl9DRkc9W28scyxsLGMsaCxhLHUscCx2XSxiLnByb3RlY3RBdHRycz1mdW5jdGlvbih0KXtpZih0KXt0PWUubWVyZ2UodCk7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZS5tZXJnZSh0W25dKSl9cmV0dXJuIHR9LGIucHJvdG90eXBlPXtfaW5pdEF0dHJIb3N0OmZ1bmN0aW9uKHQsbixyKXt0aGlzLl9zdGF0ZT1uZXcgZS5TdGF0ZSx0aGlzLl9pbml0QXR0cnModCxuLHIpfSxhZGRBdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLGk9ci5fc3RhdGUscz1pLmRhdGEsbyx1LGE7dD10fHx7fSxwIGluIHQmJihuPXRbcF0pLHU9aS5nZXQoZSxkKTtpZihuJiYhdSlpLmRhdGFbZV09e2xhenk6dCxhZGRlZDohMH07ZWxzZSBpZighdXx8dC5pc0xhenlBZGQpYT1jIGluIHQsYSYmKG89dC52YWx1ZSx0LnZhbHVlPXVuZGVmaW5lZCksdC5hZGRlZD0hMCx0LmluaXRpYWxpemluZz0hMCxzW2VdPXQsYSYmci5zZXQoZSxvKSx0LmluaXRpYWxpemluZz0hMTtyZXR1cm4gcn0sYXR0ckFkZGVkOmZ1bmN0aW9uKGUpe3JldHVybiEhdGhpcy5fc3RhdGUuZ2V0KGUsZCl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZ2V0QXR0cihlKX0sX2lzTGF6eUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3N0YXRlLmdldChlLGcpfSxfYWRkTGF6eUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9zdGF0ZTt0PXR8fG4uZ2V0KGUsZyksdCYmKG4uZGF0YVtlXS5sYXp5PXVuZGVmaW5lZCx0LmlzTGF6eUFkZD0hMCx0aGlzLmFkZEF0dHIoZSx0KSl9LHNldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuX3NldEF0dHIoZSx0LG4pfSxfc2V0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fc2V0QXR0cihlLHQsbiwhMCl9LF9zZXRBdHRyOmZ1bmN0aW9uKHQscixzLG8pe3ZhciB1PSEwLGE9dGhpcy5fc3RhdGUsbD10aGlzLl9zdGF0ZVByb3h5LGM9dGhpcy5fdENmZ3MsaCxwLGQsdixtLGcseTtyZXR1cm4gdC5pbmRleE9mKGkpIT09LTEmJihkPXQsdj10LnNwbGl0KGkpLHQ9di5zaGlmdCgpKSxjJiZjW3RdJiZ0aGlzLl9hZGRPdXRPZk9yZGVyKHQsY1t0XSksaD1hLmRhdGFbdF18fHt9LGgubGF6eSYmKGg9aC5sYXp5LHRoaXMuX2FkZExhenlBdHRyKHQsaCkpLHA9aC52YWx1ZT09PXVuZGVmaW5lZCxsJiZ0IGluIGwmJiFoLl9ieXBhc3NQcm94eSYmKHA9ITEpLGc9aC53cml0ZU9uY2UseT1oLmluaXRpYWxpemluZywhcCYmIW8mJihnJiYodT0hMSksaC5yZWFkT25seSYmKHU9ITEpKSwheSYmIW8mJmc9PT1mJiYodT0hMSksdSYmKHB8fChtPXRoaXMuZ2V0KHQpKSx2JiYocj1uLnNldFZhbHVlKGUuY2xvbmUobSksdixyKSxyPT09dW5kZWZpbmVkJiYodT0hMSkpLHUmJighdGhpcy5fZmlyZUF0dHJDaGFuZ2V8fHk/dGhpcy5fc2V0QXR0clZhbCh0LGQsbSxyLHMsaCk6dGhpcy5fZmlyZUF0dHJDaGFuZ2UodCxkLG0scixzLGgpKSksdGhpc30sX2FkZE91dE9mT3JkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtuW2VdPXQsZGVsZXRlIHRoaXMuX3RDZmdzW2VdLHRoaXMuX2FkZEF0dHJzKG4sdGhpcy5fdFZhbHMpfSxfZ2V0QXR0cjpmdW5jdGlvbihlKXt2YXIgdD1lLHI9dGhpcy5fdENmZ3MscyxvLHUsYTtyZXR1cm4gZS5pbmRleE9mKGkpIT09LTEmJihzPWUuc3BsaXQoaSksZT1zLnNoaWZ0KCkpLHImJnJbZV0mJnRoaXMuX2FkZE91dE9mT3JkZXIoZSxyW2VdKSxhPXRoaXMuX3N0YXRlLmRhdGFbZV18fHt9LGEubGF6eSYmKGE9YS5sYXp5LHRoaXMuX2FkZExhenlBdHRyKGUsYSkpLHU9dGhpcy5fZ2V0U3RhdGVWYWwoZSxhKSxvPWEuZ2V0dGVyLG8mJiFvLmNhbGwmJihvPXRoaXNbb10pLHU9bz9vLmNhbGwodGhpcyx1LHQpOnUsdT1zP24uZ2V0VmFsdWUodSxzKTp1LHV9LF9nZXRTdGF0ZVZhbDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX3N0YXRlUHJveHk7cmV0dXJuIHR8fCh0PXRoaXMuX3N0YXRlLmdldEFsbChlKXx8e30pLG4mJmUgaW4gbiYmIXQuX2J5cGFzc1Byb3h5P25bZV06dC52YWx1ZX0sX3NldFN0YXRlVmFsOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fc3RhdGVQcm94eTtuJiZlIGluIG4mJiF0aGlzLl9zdGF0ZS5nZXQoZSx2KT9uW2VdPXQ6dGhpcy5fc3RhdGUuYWRkKGUsYyx0KX0sX3NldEF0dHJWYWw6ZnVuY3Rpb24oZSx0LG4saSxzLG8pe3ZhciB1PXRoaXMsYT0hMCxmPW98fHRoaXMuX3N0YXRlLmRhdGFbZV18fHt9LGw9Zi52YWxpZGF0b3IsYz1mLnNldHRlcixoPWYuaW5pdGlhbGl6aW5nLHA9dGhpcy5fZ2V0U3RhdGVWYWwoZSxmKSxkPXR8fGUsdixnO3JldHVybiBsJiYobC5jYWxsfHwobD10aGlzW2xdKSxsJiYoZz1sLmNhbGwodSxpLGQscyksIWcmJmgmJihpPWYuZGVmYXVsdFZhbHVlLGc9ITApKSksIWx8fGc/KGMmJihjLmNhbGx8fChjPXRoaXNbY10pLGMmJih2PWMuY2FsbCh1LGksZCxzKSx2PT09eT9oP2k9Zi5kZWZhdWx0VmFsdWU6YT0hMTp2IT09dW5kZWZpbmVkJiYoaT12KSkpLGEmJighdCYmaT09PXAmJiFyLmlzT2JqZWN0KGkpP2E9ITE6KG0gaW4gZnx8KGYuaW5pdFZhbHVlPWkpLHUuX3NldFN0YXRlVmFsKGUsaSkpKSk6YT0hMSxhfSxzZXRBdHRyczpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9zZXRBdHRycyhlLHQpfSxfc2V0QXR0cnM6ZnVuY3Rpb24oZSx0KXt2YXIgbjtmb3IobiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJnRoaXMuc2V0KG4sZVtuXSx0KTtyZXR1cm4gdGhpc30sZ2V0QXR0cnM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2dldEF0dHJzKGUpfSxfZ2V0QXR0cnM6ZnVuY3Rpb24oZSl7dmFyIHQ9e30scixpLHMsbz1lPT09ITA7aWYoIWV8fG8pZT1uLmtleXModGhpcy5fc3RhdGUuZGF0YSk7Zm9yKGk9MCxzPWUubGVuZ3RoO2k8cztpKyspe3I9ZVtpXTtpZighb3x8dGhpcy5fZ2V0U3RhdGVWYWwocikhPXRoaXMuX3N0YXRlLmdldChyLG0pKXRbcl09dGhpcy5nZXQocil9cmV0dXJuIHR9LGFkZEF0dHJzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZSYmKHRoaXMuX3RDZmdzPWUsdGhpcy5fdFZhbHM9dD90aGlzLl9ub3JtQXR0clZhbHModCk6bnVsbCx0aGlzLl9hZGRBdHRycyhlLHRoaXMuX3RWYWxzLG4pLHRoaXMuX3RDZmdzPXRoaXMuX3RWYWxzPW51bGwpLHRoaXN9LF9hZGRBdHRyczpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fdENmZ3MsaT10aGlzLl90VmFscyxzLG8sdTtmb3IocyBpbiBlKWUuaGFzT3duUHJvcGVydHkocykmJihvPWVbc10sby5kZWZhdWx0VmFsdWU9by52YWx1ZSx1PXRoaXMuX2dldEF0dHJJbml0VmFsKHMsbyxpKSx1IT09dW5kZWZpbmVkJiYoby52YWx1ZT11KSxyW3NdJiYocltzXT11bmRlZmluZWQpLHRoaXMuYWRkQXR0cihzLG8sbikpfSxfcHJvdGVjdEF0dHJzOmIucHJvdGVjdEF0dHJzLF9ub3JtQXR0clZhbHM6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLHMsbyx1O2lmKCFlKXJldHVybiBudWxsO3Q9e307Zm9yKHUgaW4gZSllLmhhc093blByb3BlcnR5KHUpJiYodS5pbmRleE9mKGkpIT09LTE/KHI9dS5zcGxpdChpKSxzPXIuc2hpZnQoKSxuPW58fHt9LG89bltzXT1uW3NdfHxbXSxvW28ubGVuZ3RoXT17cGF0aDpyLHZhbHVlOmVbdV19KTp0W3VdPWVbdV0pO3JldHVybntzaW1wbGU6dCxjb21wbGV4Om59fSxfZ2V0QXR0ckluaXRWYWw6ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPXQudmFsdWUscz10LnZhbHVlRm4sbyx1PSExLGE9dC5yZWFkT25seSxmLGwsYyxoLHAsZCx2OyFhJiZyJiYoZj1yLnNpbXBsZSxmJiZmLmhhc093blByb3BlcnR5KGUpJiYoaT1mW2VdLHU9ITApKSxzJiYhdSYmKHMuY2FsbHx8KHM9dGhpc1tzXSkscyYmKG89cy5jYWxsKHRoaXMsZSksaT1vKSk7aWYoIWEmJnIpe2w9ci5jb21wbGV4O2lmKGwmJmwuaGFzT3duUHJvcGVydHkoZSkmJmkhPT11bmRlZmluZWQmJmkhPT1udWxsKXt2PWxbZV07Zm9yKGM9MCxoPXYubGVuZ3RoO2M8aDsrK2MpcD12W2NdLnBhdGgsZD12W2NdLnZhbHVlLG4uc2V0VmFsdWUoaSxwLGQpfX1yZXR1cm4gaX0sX2luaXRBdHRyczpmdW5jdGlvbih0LG4scil7dD10fHx0aGlzLmNvbnN0cnVjdG9yLkFUVFJTO3ZhciBpPWUuQmFzZSxzPWUuQmFzZUNvcmUsbz1pJiZlLmluc3RhbmNlT2YodGhpcyxpKSx1PSFvJiZzJiZlLmluc3RhbmNlT2YodGhpcyxzKTt0JiYhbyYmIXUmJnRoaXMuYWRkQXR0cnMoZS5BdHRyaWJ1dGVDb3JlLnByb3RlY3RBdHRycyh0KSxuLHIpfX0sZS5BdHRyaWJ1dGVDb3JlPWJ9LCIzLjE3LjIiLHtyZXF1aXJlczpbIm9vcCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1jdXN0b20tY29tcGxleCIsZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5PYmplY3QscyxvPXt9LHU9ZS5DdXN0b21FdmVudC5wcm90b3R5cGUsYT1lLkV2ZW50VGFyZ2V0LnByb3RvdHlwZSxmPWZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKG4gaW4gdClyLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX07ZS5FdmVudEZhY2FkZT1mdW5jdGlvbihlLHQpe2V8fChlPW8pLHRoaXMuX2V2ZW50PWUsdGhpcy5kZXRhaWxzPWUuZGV0YWlscyx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuX3R5cGU9ZS50eXBlLHRoaXMudGFyZ2V0PWUudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD10LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXR9LGUubWl4KGUuRXZlbnRGYWNhZGUucHJvdG90eXBlLHtzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLl9ldmVudC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BwZWQ9MX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wcGVkPTJ9LHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQucHJldmVudERlZmF1bHQoKSx0aGlzLnByZXZlbnRlZD0xfSxoYWx0OmZ1bmN0aW9uKGUpe3RoaXMuX2V2ZW50LmhhbHQoZSksdGhpcy5wcmV2ZW50ZWQ9MSx0aGlzLnN0b3BwZWQ9ZT8yOjF9fSksdS5maXJlQ29tcGxleD1mdW5jdGlvbih0KXt2YXIgbixyLGkscyxvLHU9ITAsYSxmLGwsYyxoLHAsZCx2LG0sZz10aGlzLHk9Zy5ob3N0fHxnLGIsdyxFPWcuc3RhY2ssUz15Ll95dWlldnQseDtpZihFJiZnLnF1ZXVhYmxlJiZnLnR5cGUhPT1FLm5leHQudHlwZSlyZXR1cm4gRS5xdWV1ZXx8KEUucXVldWU9W10pLEUucXVldWUucHVzaChbZyx0XSksITA7eD1nLmhhc1N1YnMoKXx8Uy5oYXNUYXJnZXRzfHxnLmJyb2FkY2FzdCxnLnRhcmdldD1nLnRhcmdldHx8eSxnLmN1cnJlbnRUYXJnZXQ9eSxnLmRldGFpbHM9dC5jb25jYXQoKTtpZih4KXtuPUV8fHtpZDpnLmlkLG5leHQ6ZyxzaWxlbnQ6Zy5zaWxlbnQsc3RvcHBlZDowLHByZXZlbnRlZDowLGJ1YmJsaW5nOm51bGwsdHlwZTpnLnR5cGUsZGVmYXVsdFRhcmdldE9ubHk6Zy5kZWZhdWx0VGFyZ2V0T25seX0sZj1nLmdldFN1YnMoKSxsPWZbMF0sYz1mWzFdLGcuc3RvcHBlZD1nLnR5cGUhPT1uLnR5cGU/MDpuLnN0b3BwZWQsZy5wcmV2ZW50ZWQ9Zy50eXBlIT09bi50eXBlPzA6bi5wcmV2ZW50ZWQsZy5zdG9wcGVkRm4mJihhPW5ldyBlLkV2ZW50VGFyZ2V0KHtmaXJlT25jZTohMCxjb250ZXh0Onl9KSxnLmV2ZW50cz1hLGEub24oInN0b3BwZWQiLGcuc3RvcHBlZEZuKSksZy5fZmFjYWRlPW51bGwscj1nLl9jcmVhdGVGYWNhZGUodCksbCYmZy5fcHJvY1N1YnMobCx0LHIpLGcuYnViYmxlcyYmeS5idWJibGUmJiFnLnN0b3BwZWQmJih3PW4uYnViYmxpbmcsbi5idWJibGluZz1nLnR5cGUsbi50eXBlIT09Zy50eXBlJiYobi5zdG9wcGVkPTAsbi5wcmV2ZW50ZWQ9MCksdT15LmJ1YmJsZShnLHQsbnVsbCxuKSxnLnN0b3BwZWQ9TWF0aC5tYXgoZy5zdG9wcGVkLG4uc3RvcHBlZCksZy5wcmV2ZW50ZWQ9TWF0aC5tYXgoZy5wcmV2ZW50ZWQsbi5wcmV2ZW50ZWQpLG4uYnViYmxpbmc9dyksZD1nLnByZXZlbnRlZCxkPyh2PWcucHJldmVudGVkRm4sdiYmdi5hcHBseSh5LHQpKToobT1nLmRlZmF1bHRGbixtJiYoIWcuZGVmYXVsdFRhcmdldE9ubHkmJiFuLmRlZmF1bHRUYXJnZXRPbmx5fHx5PT09ci50YXJnZXQpJiZtLmFwcGx5KHksdCkpLGcuYnJvYWRjYXN0JiZnLl9icm9hZGNhc3QodCk7aWYoYyYmIWcucHJldmVudGVkJiZnLnN0b3BwZWQ8Mil7aD1uLmFmdGVyUXVldWU7aWYobi5pZD09PWcuaWR8fGcudHlwZSE9PVMuYnViYmxpbmcpe2cuX3Byb2NTdWJzKGMsdCxyKTtpZihoKXdoaWxlKGI9aC5sYXN0KCkpYigpfWVsc2UgcD1jLG4uZXhlY0RlZmF1bHRDbnQmJihwPWUubWVyZ2UocCksZS5lYWNoKHAsZnVuY3Rpb24oZSl7ZS5wb3N0cG9uZWQ9ITB9KSksaHx8KG4uYWZ0ZXJRdWV1ZT1uZXcgZS5RdWV1ZSksbi5hZnRlclF1ZXVlLmFkZChmdW5jdGlvbigpe2cuX3Byb2NTdWJzKHAsdCxyKX0pfWcudGFyZ2V0PW51bGw7aWYobi5pZD09PWcuaWQpe3M9bi5xdWV1ZTtpZihzKXdoaWxlKHMubGVuZ3RoKWk9cy5wb3AoKSxvPWlbMF0sbi5uZXh0PW8sby5fZmlyZShpWzFdKTtnLnN0YWNrPW51bGx9dT0hZy5zdG9wcGVkLGcudHlwZSE9PVMuYnViYmxpbmcmJihuLnN0b3BwZWQ9MCxuLnByZXZlbnRlZD0wLGcuc3RvcHBlZD0wLGcucHJldmVudGVkPTApfWVsc2UgbT1nLmRlZmF1bHRGbixtJiYocj1nLl9jcmVhdGVGYWNhZGUodCksKCFnLmRlZmF1bHRUYXJnZXRPbmx5fHx5PT09ci50YXJnZXQpJiZtLmFwcGx5KHksdCkpO3JldHVybiBnLl9mYWNhZGU9bnVsbCx1fSx1Ll9oYXNQb3RlbnRpYWxTdWJzY3JpYmVycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc1N1YnMoKXx8dGhpcy5ob3N0Ll95dWlldnQuaGFzVGFyZ2V0c3x8dGhpcy5icm9hZGNhc3R9LHUuX2NyZWF0ZUZhY2FkZT11Ll9nZXRGYWNhZGU9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5kZXRhaWxzLHI9biYmblswXSxpPXImJnR5cGVvZiByPT0ib2JqZWN0IixzPXRoaXMuX2ZhY2FkZTtyZXR1cm4gc3x8KHM9bmV3IGUuRXZlbnRGYWNhZGUodGhpcyx0aGlzLmN1cnJlbnRUYXJnZXQpKSxpPyhmKHMsciksci50eXBlJiYocy50eXBlPXIudHlwZSksdCYmKHRbMF09cykpOnQmJnQudW5zaGlmdChzKSxzLmRldGFpbHM9dGhpcy5kZXRhaWxzLHMudGFyZ2V0PXRoaXMub3JpZ2luYWxUYXJnZXR8fHRoaXMudGFyZ2V0LHMuY3VycmVudFRhcmdldD10aGlzLmN1cnJlbnRUYXJnZXQscy5zdG9wcGVkPTAscy5wcmV2ZW50ZWQ9MCx0aGlzLl9mYWNhZGU9cyx0aGlzLl9mYWNhZGV9LHUuX2FkZEZhY2FkZVRvQXJncz1mdW5jdGlvbihlKXt2YXIgdD1lWzBdO3QmJnQuaGFsdCYmdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJnQuc3RvcFByb3BhZ2F0aW9uJiZ0Ll9ldmVudHx8dGhpcy5fY3JlYXRlRmFjYWRlKGUpfSx1LnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe3RoaXMuc3RvcHBlZD0xLHRoaXMuc3RhY2smJih0aGlzLnN0YWNrLnN0b3BwZWQ9MSksdGhpcy5ldmVudHMmJnRoaXMuZXZlbnRzLmZpcmUoInN0b3BwZWQiLHRoaXMpfSx1LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbj1mdW5jdGlvbigpe3RoaXMuc3RvcHBlZD0yLHRoaXMuc3RhY2smJih0aGlzLnN0YWNrLnN0b3BwZWQ9MiksdGhpcy5ldmVudHMmJnRoaXMuZXZlbnRzLmZpcmUoInN0b3BwZWQiLHRoaXMpfSx1LnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dGhpcy5wcmV2ZW50YWJsZSYmKHRoaXMucHJldmVudGVkPTEsdGhpcy5zdGFjayYmKHRoaXMuc3RhY2sucHJldmVudGVkPTEpKX0sdS5oYWx0PWZ1bmN0aW9uKGUpe2U/dGhpcy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTp0aGlzLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMucHJldmVudERlZmF1bHQoKX0sYS5hZGRUYXJnZXQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5feXVpZXZ0O3JldHVybiBuLnRhcmdldHN8fChuLnRhcmdldHM9e30pLG4udGFyZ2V0c1tlLnN0YW1wKHQpXT10LG4uaGFzVGFyZ2V0cz0hMCx0aGlzfSxhLmdldFRhcmdldHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl95dWlldnQudGFyZ2V0cztyZXR1cm4gZT9pLnZhbHVlcyhlKTpbXX0sYS5yZW1vdmVUYXJnZXQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5feXVpZXZ0LnRhcmdldHM7cmV0dXJuIG4mJihkZWxldGUgbltlLnN0YW1wKHQsITApXSxpLnNpemUobik9PT0wJiYodGhpcy5feXVpZXZ0Lmhhc1RhcmdldHM9ITEpKSx0aGlzfSxhLmJ1YmJsZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLl95dWlldnQudGFyZ2V0cyxzPSEwLG8sdSxhLGYsbCxjPWUmJmUudHlwZSxoPW58fGUmJmUudGFyZ2V0fHx0aGlzLHA7aWYoIWV8fCFlLnN0b3BwZWQmJmkpZm9yKGEgaW4gaSlpZihpLmhhc093blByb3BlcnR5KGEpKXtvPWlbYV0sdT1vLl95dWlldnQuZXZlbnRzW2NdLG8uX2hhc1NpYmxpbmdzJiYobD1vLmdldFNpYmxpbmcoYyx1KSksbCYmIXUmJih1PW8ucHVibGlzaChjKSkscD1vLl95dWlldnQuYnViYmxpbmcsby5feXVpZXZ0LmJ1YmJsaW5nPWM7aWYoIXUpby5feXVpZXZ0Lmhhc1RhcmdldHMmJm8uYnViYmxlKGUsdCxoLHIpO2Vsc2V7bCYmKHUuc2libGluZz1sKSx1LnRhcmdldD1oLHUub3JpZ2luYWxUYXJnZXQ9aCx1LmN1cnJlbnRUYXJnZXQ9byxmPXUuYnJvYWRjYXN0LHUuYnJvYWRjYXN0PSExLHUuZW1pdEZhY2FkZT0hMCx1LnN0YWNrPXIscz1zJiZ1LmZpcmUuYXBwbHkodSx0fHxlLmRldGFpbHN8fFtdKSx1LmJyb2FkY2FzdD1mLHUub3JpZ2luYWxUYXJnZXQ9bnVsbDtpZih1LnN0b3BwZWQpYnJlYWt9by5feXVpZXZ0LmJ1YmJsaW5nPXB9cmV0dXJuIHN9LGEuX2hhc1BvdGVudGlhbFN1YnNjcmliZXJzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3l1aWV2dCxuPXQuZXZlbnRzW2VdO3JldHVybiBuP24uaGFzU3VicygpfHx0Lmhhc1RhcmdldHN8fG4uYnJvYWRjYXN0OiExfSxuPW5ldyBlLkV2ZW50RmFjYWRlLHI9e307Zm9yKHMgaW4gbilyW3NdPSEwfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJiYXNlLWNvcmUiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gdihlKXt0aGlzLl9CYXNlSW52b2tlZHx8KHRoaXMuX0Jhc2VJbnZva2VkPSEwLHRoaXMuX2luaXRCYXNlKGUpKX12YXIgbj1lLk9iamVjdCxyPWUuTGFuZyxpPSIuIixzPSJpbml0aWFsaXplZCIsbz0iZGVzdHJveWVkIix1PSJpbml0aWFsaXplciIsYT0idmFsdWUiLGY9T2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcixsPSJkZWVwIixjPSJzaGFsbG93IixoPSJkZXN0cnVjdG9yIixwPWUuQXR0cmlidXRlQ29yZSxkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtmb3IociBpbiB0KW5bcl0mJihlW3JdPXRbcl0pO3JldHVybiBlfTt2Ll9BVFRSX0NGRz1wLl9BVFRSX0NGRy5jb25jYXQoImNsb25lRGVmYXVsdFZhbHVlIiksdi5fTk9OX0FUVFJTX0NGRz1bInBsdWdpbnMiXSx2Lk5BTUU9ImJhc2VDb3JlIix2LkFUVFJTPXtpbml0aWFsaXplZDp7cmVhZE9ubHk6ITAsdmFsdWU6ITF9LGRlc3Ryb3llZDp7cmVhZE9ubHk6ITAsdmFsdWU6ITF9fSx2Lm1vZGlmeUF0dHJzPWZ1bmN0aW9uKHQsbil7dHlwZW9mIHQhPSJmdW5jdGlvbiImJihuPXQsdD10aGlzKTt2YXIgcixpLHM7cj10LkFUVFJTfHwodC5BVFRSUz17fSk7aWYobil7dC5fQ0FDSEVEX0NMQVNTX0RBVEE9bnVsbDtmb3IocyBpbiBuKW4uaGFzT3duUHJvcGVydHkocykmJihpPXJbc118fChyW3NdPXt9KSxlLm1peChpLG5bc10sITApKX19LHYucHJvdG90eXBlPXtfaW5pdEJhc2U6ZnVuY3Rpb24odCl7ZS5zdGFtcCh0aGlzKSx0aGlzLl9pbml0QXR0cmlidXRlKHQpO3ZhciBuPWUuUGx1Z2luJiZlLlBsdWdpbi5Ib3N0O3RoaXMuX2luaXRQbHVnaW5zJiZuJiZuLmNhbGwodGhpcyksdGhpcy5fbGF6eUFkZEF0dHJzIT09ITEmJih0aGlzLl9sYXp5QWRkQXR0cnM9ITApLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLk5BTUUsdGhpcy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX2luaXRBdHRyaWJ1dGU6ZnVuY3Rpb24oKXtwLmNhbGwodGhpcyl9LGluaXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2Jhc2VJbml0KGUpLHRoaXN9LF9iYXNlSW5pdDpmdW5jdGlvbihlKXt0aGlzLl9pbml0SGllcmFyY2h5KGUpLHRoaXMuX2luaXRQbHVnaW5zJiZ0aGlzLl9pbml0UGx1Z2lucyhlKSx0aGlzLl9zZXQocywhMCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZURlc3Ryb3koKSx0aGlzfSxfYmFzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9kZXN0cm95UGx1Z2lucyYmdGhpcy5fZGVzdHJveVBsdWdpbnMoKSx0aGlzLl9kZXN0cm95SGllcmFyY2h5KCksdGhpcy5fc2V0KG8sITApfSxfZ2V0Q2xhc3NlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jbGFzc2VzfHx0aGlzLl9pbml0SGllcmFyY2h5RGF0YSgpLHRoaXMuX2NsYXNzZXN9LF9nZXRBdHRyQ2ZnczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hdHRyc3x8dGhpcy5faW5pdEhpZXJhcmNoeURhdGEoKSx0aGlzLl9hdHRyc30sX2dldEluc3RhbmNlQXR0ckNmZ3M6ZnVuY3Rpb24oZSl7dmFyIHQ9e30scixpLHMsbyx1LGEsZixsPWUuX3N1YkF0dHJzLGM9dGhpcy5fYXR0ckNmZ0hhc2goKTtmb3IoYSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoYSkmJmEhPT0iX3N1YkF0dHJzIil7Zj1lW2FdLHI9dFthXT1kKHt9LGYsYyksaT1yLnZhbHVlLGkmJnR5cGVvZiBpPT0ib2JqZWN0IiYmdGhpcy5fY2xvbmVEZWZhdWx0VmFsdWUoYSxyKTtpZihsJiZsLmhhc093blByb3BlcnR5KGEpKXtvPWUuX3N1YkF0dHJzW2FdO2Zvcih1IGluIG8pcz1vW3VdLHMucGF0aCYmbi5zZXRWYWx1ZShyLnZhbHVlLHMucGF0aCxzLnZhbHVlKX19cmV0dXJuIHR9LF9maWx0ZXJBZEhvY0F0dHJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLl9ub25BdHRycyxpO2lmKHQpe249e307Zm9yKGkgaW4gdCkhZVtpXSYmIXJbaV0mJnQuaGFzT3duUHJvcGVydHkoaSkmJihuW2ldPXt2YWx1ZTp0W2ldfSl9cmV0dXJuIG59LF9pbml0SGllcmFyY2h5RGF0YTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuY29uc3RydWN0b3IsdD1lLl9DQUNIRURfQ0xBU1NfREFUQSxuLHIsaSxzLG8sdT0hZS5fQVRUUl9DRkdfSEFTSCxhLGY9e30sbD1bXSxjPVtdO249ZTtpZighdCl7d2hpbGUobil7bFtsLmxlbmd0aF09bixuLkFUVFJTJiYoY1tjLmxlbmd0aF09bi5BVFRSUyk7aWYodSl7cz1uLl9BVFRSX0NGRyxvPW98fHt9O2lmKHMpZm9yKHI9MCxpPXMubGVuZ3RoO3I8aTtyKz0xKW9bc1tyXV09ITB9YT1uLl9OT05fQVRUUlNfQ0ZHO2lmKGEpZm9yKHI9MCxpPWEubGVuZ3RoO3I8aTtyKyspZlthW3JdXT0hMDtuPW4uc3VwZXJjbGFzcz9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3I6bnVsbH11JiYoZS5fQVRUUl9DRkdfSEFTSD1vKSx0PWUuX0NBQ0hFRF9DTEFTU19EQVRBPXtjbGFzc2VzOmwsbm9uQXR0cnM6ZixhdHRyczp0aGlzLl9hZ2dyZWdhdGVBdHRycyhjKX19dGhpcy5fY2xhc3Nlcz10LmNsYXNzZXMsdGhpcy5fYXR0cnM9dC5hdHRycyx0aGlzLl9ub25BdHRycz10Lm5vbkF0dHJzfSxfYXR0ckNmZ0hhc2g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5fQVRUUl9DRkdfSEFTSH0sX2Nsb25lRGVmYXVsdFZhbHVlOmZ1bmN0aW9uKHQsbil7dmFyIGk9bi52YWx1ZSxzPW4uY2xvbmVEZWZhdWx0VmFsdWU7cz09PWx8fHM9PT0hMD9uLnZhbHVlPWUuY2xvbmUoaSk6cz09PWM/bi52YWx1ZT1lLm1lcmdlKGkpOnM9PT11bmRlZmluZWQmJihmPT09aS5jb25zdHJ1Y3Rvcnx8ci5pc0FycmF5KGkpKSYmKG4udmFsdWU9ZS5jbG9uZShpKSl9LF9hZ2dyZWdhdGVBdHRyczpmdW5jdGlvbihlKXt2YXIgdCxuLHIscyxvLHUsZj10aGlzLl9hdHRyQ2ZnSGFzaCgpLGwsYz17fTtpZihlKWZvcih1PWUubGVuZ3RoLTE7dT49MDstLXUpe249ZVt1XTtmb3IodCBpbiBuKW4uaGFzT3duUHJvcGVydHkodCkmJihzPWQoe30sblt0XSxmKSxvPW51bGwsdC5pbmRleE9mKGkpIT09LTEmJihvPXQuc3BsaXQoaSksdD1vLnNoaWZ0KCkpLGw9Y1t0XSxvJiZsJiZsLnZhbHVlPyhyPWMuX3N1YkF0dHJzLHJ8fChyPWMuX3N1YkF0dHJzPXt9KSxyW3RdfHwoclt0XT17fSksclt0XVtvLmpvaW4oaSldPXt2YWx1ZTpzLnZhbHVlLHBhdGg6b30pOm98fChsPyhsLnZhbHVlRm4mJmEgaW4gcyYmKGwudmFsdWVGbj1udWxsKSxkKGwscyxmKSk6Y1t0XT1zKSl9cmV0dXJuIGN9LF9pbml0SGllcmFyY2h5OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xhenlBZGRBdHRycyxuLHIsaSxzLG8sYSxmLGwsYyxoLHAsZD1bXSx2PXRoaXMuX2dldENsYXNzZXMoKSxtPXRoaXMuX2dldEF0dHJDZmdzKCksZz12Lmxlbmd0aC0xO2ZvcihvPWc7bz49MDtvLS0pe249dltvXSxyPW4ucHJvdG90eXBlLGg9bi5feXVpYnVpbGQmJm4uX3l1aWJ1aWxkLmV4dHMsci5oYXNPd25Qcm9wZXJ0eSh1KSYmKGRbZC5sZW5ndGhdPXIuaW5pdGlhbGl6ZXIpO2lmKGgpZm9yKGE9MCxmPWgubGVuZ3RoO2E8ZjthKyspbD1oW2FdLGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLGM9bC5wcm90b3R5cGUsYy5oYXNPd25Qcm9wZXJ0eSh1KSYmKGRbZC5sZW5ndGhdPWMuaW5pdGlhbGl6ZXIpfXA9dGhpcy5fZ2V0SW5zdGFuY2VBdHRyQ2ZncyhtKSx0aGlzLl9wcmVBZGRBdHRycyYmdGhpcy5fcHJlQWRkQXR0cnMocCxlLHQpLHRoaXMuX2FsbG93QWRIb2NBdHRycyYmdGhpcy5hZGRBdHRycyh0aGlzLl9maWx0ZXJBZEhvY0F0dHJzKG0sZSksZSx0KSx0aGlzLmFkZEF0dHJzKHAsZSx0KTtmb3IoaT0wLHM9ZC5sZW5ndGg7aTxzO2krKylkW2ldLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX2Rlc3Ryb3lIaWVyYXJjaHk6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLHMsbyx1LGE9dGhpcy5fZ2V0Q2xhc3NlcygpO2ZvcihuPTAscj1hLmxlbmd0aDtuPHI7bisrKXtlPWFbbl0sdD1lLnByb3RvdHlwZSxvPWUuX3l1aWJ1aWxkJiZlLl95dWlidWlsZC5leHRzO2lmKG8pZm9yKGk9MCxzPW8ubGVuZ3RoO2k8cztpKyspdT1vW2ldLnByb3RvdHlwZSx1Lmhhc093blByb3BlcnR5KGgpJiZ1LmRlc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpO3QuaGFzT3duUHJvcGVydHkoaCkmJnQuZGVzdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIlsiK2Uuc3RhbXAodGhpcywhMCkrIl0ifX0sZS5taXgodixwLCExLG51bGwsMSksdi5wcm90b3R5cGUuY29uc3RydWN0b3I9dixlLkJhc2VDb3JlPXZ9LCIzLjE3LjIiLHtyZXF1aXJlczpbImF0dHJpYnV0ZS1jb3JlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImF0dHJpYnV0ZS1iYXNlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtlLkF0dHJpYnV0ZUNvcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUuQXR0cmlidXRlT2JzZXJ2YWJsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS5BdHRyaWJ1dGVFeHRyYXMuYXBwbHkodGhpcyxhcmd1bWVudHMpfWUubWl4KG4sZS5BdHRyaWJ1dGVDb3JlLCExLG51bGwsMSksZS5taXgobixlLkF0dHJpYnV0ZUV4dHJhcywhMSxudWxsLDEpLGUubWl4KG4sZS5BdHRyaWJ1dGVPYnNlcnZhYmxlLCEwLG51bGwsMSksbi5JTlZBTElEX1ZBTFVFPWUuQXR0cmlidXRlQ29yZS5JTlZBTElEX1ZBTFVFLG4uX0FUVFJfQ0ZHPWUuQXR0cmlidXRlQ29yZS5fQVRUUl9DRkcuY29uY2F0KGUuQXR0cmlidXRlT2JzZXJ2YWJsZS5fQVRUUl9DRkcpLG4ucHJvdGVjdEF0dHJzPWUuQXR0cmlidXRlQ29yZS5wcm90ZWN0QXR0cnMsZS5BdHRyaWJ1dGU9bn0sIjMuMTcuMiIse3JlcXVpcmVzOlsiYXR0cmlidXRlLWNvcmUiLCJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImF0dHJpYnV0ZS1leHRyYXMiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiYXR0cmlidXRlLWV4dHJhcyIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBvKCl7fXZhciBuPSJicm9hZGNhc3QiLHI9InB1Ymxpc2hlZCIsaT0iaW5pdFZhbHVlIixzPXtyZWFkT25seToxLHdyaXRlT25jZToxLGdldHRlcjoxLGJyb2FkY2FzdDoxfTtvLnByb3RvdHlwZT17bW9kaWZ5QXR0cjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMsbyx1O2lmKGkuYXR0ckFkZGVkKGUpKXtpLl9pc0xhenlBdHRyKGUpJiZpLl9hZGRMYXp5QXR0cihlKSx1PWkuX3N0YXRlO2ZvcihvIGluIHQpc1tvXSYmdC5oYXNPd25Qcm9wZXJ0eShvKSYmKHUuYWRkKGUsbyx0W29dKSxvPT09biYmdS5yZW1vdmUoZSxyKSl9fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3RoaXMuX3N0YXRlLnJlbW92ZUFsbChlKX0scmVzZXQ6ZnVuY3Rpb24odCl7dmFyIG49dGhpcztyZXR1cm4gdD8obi5faXNMYXp5QXR0cih0KSYmbi5fYWRkTGF6eUF0dHIodCksbi5zZXQodCxuLl9zdGF0ZS5nZXQodCxpKSkpOmUuT2JqZWN0LmVhY2gobi5fc3RhdGUuZGF0YSxmdW5jdGlvbihlLHQpe24ucmVzZXQodCl9KSxufSxfZ2V0QXR0ckNmZzpmdW5jdGlvbih0KXt2YXIgbixyPXRoaXMuX3N0YXRlO3JldHVybiB0P249ci5nZXRBbGwodCl8fHt9OihuPXt9LGUuZWFjaChyLmRhdGEsZnVuY3Rpb24oZSx0KXtuW3RdPXIuZ2V0QWxsKHQpfSkpLG59fSxlLkF0dHJpYnV0ZUV4dHJhcz1vfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJvb3AiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiYXR0cmlidXRlLW9ic2VydmFibGUiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gcygpe3RoaXMuX0FUVFJfRV9GQUNBREU9e30sbi5jYWxsKHRoaXMse2VtaXRGYWNhZGU6ITB9KX12YXIgbj1lLkV2ZW50VGFyZ2V0LHI9IkNoYW5nZSIsaT0iYnJvYWRjYXN0IjtzLl9BVFRSX0NGRz1baV0scy5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuX3NldEF0dHIoZSx0LG4pfSxfc2V0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fc2V0QXR0cihlLHQsbiwhMCl9LHNldEF0dHJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3NldEF0dHJzKGUsdCl9LF9zZXRBdHRyczpmdW5jdGlvbihlLHQpe3ZhciBuO2ZvcihuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmdGhpcy5zZXQobixlW25dLHQpO3JldHVybiB0aGlzfSxfZmlyZUF0dHJDaGFuZ2U6ZnVuY3Rpb24odCxuLGkscyxvLHUpe3ZhciBhPXRoaXMsZj10aGlzLl9nZXRGdWxsVHlwZSh0K3IpLGw9YS5fc3RhdGUsYyxoLHA7dXx8KHU9bC5kYXRhW3RdfHx7fSksdS5wdWJsaXNoZWR8fChwPWEuX3B1Ymxpc2goZikscC5lbWl0RmFjYWRlPSEwLHAuZGVmYXVsdFRhcmdldE9ubHk9ITAscC5kZWZhdWx0Rm49YS5fZGVmQXR0ckNoYW5nZUZuLGg9dS5icm9hZGNhc3QsaCE9PXVuZGVmaW5lZCYmKHAuYnJvYWRjYXN0PWgpLHUucHVibGlzaGVkPSEwKSxvPyhjPWUubWVyZ2UobyksYy5fYXR0ck9wdHM9byk6Yz1hLl9BVFRSX0VfRkFDQURFLGMuYXR0ck5hbWU9dCxjLnN1YkF0dHJOYW1lPW4sYy5wcmV2VmFsPWksYy5uZXdWYWw9cyxhLl9oYXNQb3RlbnRpYWxTdWJzY3JpYmVycyhmKT9hLmZpcmUoZixjKTp0aGlzLl9zZXRBdHRyVmFsKHQsbixpLHMsbyx1KX0sX2RlZkF0dHJDaGFuZ2VGbjpmdW5jdGlvbihlLHQpe3ZhciBuPWUuX2F0dHJPcHRzO24mJmRlbGV0ZSBlLl9hdHRyT3B0cyx0aGlzLl9zZXRBdHRyVmFsKGUuYXR0ck5hbWUsZS5zdWJBdHRyTmFtZSxlLnByZXZWYWwsZS5uZXdWYWwsbik/dHx8KGUubmV3VmFsPXRoaXMuZ2V0KGUuYXR0ck5hbWUpKTp0fHxlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfX0sZS5taXgocyxuLCExLG51bGwsMSksZS5BdHRyaWJ1dGVPYnNlcnZhYmxlPXMsZS5BdHRyaWJ1dGVFdmVudHM9c30sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtY3VzdG9tIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImJhc2Utb2JzZXJ2YWJsZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBmKCl7fXZhciBuPWUuTGFuZyxyPSJkZXN0cm95IixpPSJpbml0IixzPSJidWJibGVUYXJnZXRzIixvPSJfYnViYmxlVGFyZ2V0cyIsdT1lLkF0dHJpYnV0ZU9ic2VydmFibGUsYT1lLkJhc2VDb3JlO2YuX0FUVFJfQ0ZHPXUuX0FUVFJfQ0ZHLmNvbmNhdCgpLGYuX05PTl9BVFRSU19DRkc9WyJvbiIsImFmdGVyIiwiYnViYmxlVGFyZ2V0cyJdLGYucHJvdG90eXBlPXtfaW5pdEF0dHJpYnV0ZTpmdW5jdGlvbigpe2EucHJvdG90eXBlLl9pbml0QXR0cmlidXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx1LmNhbGwodGhpcyksdGhpcy5fZXZlbnRQcmVmaXg9dGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9QUkVGSVh8fHRoaXMuY29uc3RydWN0b3IuTkFNRSx0aGlzLl95dWlldnQuY29uZmlnLnByZWZpeD10aGlzLl9ldmVudFByZWZpeH0saW5pdDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRGdWxsVHlwZShpKSxuPXRoaXMuX3B1Ymxpc2godCk7cmV0dXJuIG4uZW1pdEZhY2FkZT0hMCxuLmZpcmVPbmNlPSEwLG4uZGVmYXVsdFRhcmdldE9ubHk9ITAsbi5kZWZhdWx0Rm49dGhpcy5fZGVmSW5pdEZuLHRoaXMuX3ByZUluaXRFdmVudENmZyhlKSxuLl9oYXNQb3RlbnRpYWxTdWJzY3JpYmVycygpP3RoaXMuZmlyZSh0LHtjZmc6ZX0pOih0aGlzLl9iYXNlSW5pdChlKSxuLmZpcmVkPSEwLG4uZmlyZWRXaXRoPVt7Y2ZnOmV9XSksdGhpc30sX3ByZUluaXRFdmVudENmZzpmdW5jdGlvbihlKXtlJiYoZS5vbiYmdGhpcy5vbihlLm9uKSxlLmFmdGVyJiZ0aGlzLmFmdGVyKGUuYWZ0ZXIpKTt2YXIgdCxyLGksdT1lJiZzIGluIGU7aWYodXx8byBpbiB0aGlzKXtpPXU/ZSYmZS5idWJibGVUYXJnZXRzOnRoaXMuX2J1YmJsZVRhcmdldHM7aWYobi5pc0FycmF5KGkpKWZvcih0PTAscj1pLmxlbmd0aDt0PHI7dCsrKXRoaXMuYWRkVGFyZ2V0KGlbdF0pO2Vsc2UgaSYmdGhpcy5hZGRUYXJnZXQoaSl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVibGlzaChyLHtmaXJlT25jZTohMCxkZWZhdWx0VGFyZ2V0T25seTohMCxkZWZhdWx0Rm46dGhpcy5fZGVmRGVzdHJveUZufSksdGhpcy5maXJlKHIpLHRoaXMuZGV0YWNoQWxsKCksdGhpc30sX2RlZkluaXRGbjpmdW5jdGlvbihlKXt0aGlzLl9iYXNlSW5pdChlLmNmZyl9LF9kZWZEZXN0cm95Rm46ZnVuY3Rpb24oZSl7dGhpcy5fYmFzZURlc3Ryb3koZS5jZmcpfX0sZS5taXgoZix1LCExLG51bGwsMSksZS5CYXNlT2JzZXJ2YWJsZT1mfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImJhc2UtY29yZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJiYXNlLWJhc2UiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbygpe2kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBuPWUuQXR0cmlidXRlQ29yZSxyPWUuQXR0cmlidXRlRXh0cmFzLGk9ZS5CYXNlQ29yZSxzPWUuQmFzZU9ic2VydmFibGU7by5fQVRUUl9DRkc9aS5fQVRUUl9DRkcuY29uY2F0KHMuX0FUVFJfQ0ZHKSxvLl9OT05fQVRUUlNfQ0ZHPWkuX05PTl9BVFRSU19DRkcuY29uY2F0KHMuX05PTl9BVFRSU19DRkcpLG8uTkFNRT0iYmFzZSIsby5BVFRSUz1uLnByb3RlY3RBdHRycyhpLkFUVFJTKSxvLm1vZGlmeUF0dHJzPWkubW9kaWZ5QXR0cnMsZS5taXgobyxpLCExLG51bGwsMSksZS5taXgobyxyLCExLG51bGwsMSksZS5taXgobyxzLCEwLG51bGwsMSksby5wcm90b3R5cGUuY29uc3RydWN0b3I9byxlLkJhc2U9b30sIjMuMTcuMiIse3JlcXVpcmVzOlsiYXR0cmlidXRlLWJhc2UiLCJiYXNlLWNvcmUiLCJiYXNlLW9ic2VydmFibGUiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiYmFzZS1wbHVnaW5ob3N0IixmdW5jdGlvbihlLHQpe3ZhciBuPWUuQmFzZSxyPWUuUGx1Z2luLkhvc3Q7ZS5taXgobixyLCExLG51bGwsMSksbi5wbHVnPXIucGx1ZyxuLnVucGx1Zz1yLnVucGx1Z30sIjMuMTcuMiIse3JlcXVpcmVzOlsiYmFzZS1iYXNlIiwicGx1Z2luaG9zdCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJiYXNlLWJ1aWxkIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGYoZSx0LG4pe25bZV0mJih0W2VdPSh0W2VdfHxbXSkuY29uY2F0KG5bZV0pKX1mdW5jdGlvbiBsKGUsdCxuKXtuLl9BVFRSX0NGRyYmKHQuX0FUVFJfQ0ZHX0hBU0g9bnVsbCxmLmFwcGx5KG51bGwsYXJndW1lbnRzKSl9ZnVuY3Rpb24gYyhlLHQscil7bi5tb2RpZnlBdHRycyh0LHIuQVRUUlMpfXZhciBuPWUuQmFzZUNvcmUscj1lLkJhc2UsaT1lLkxhbmcscz0iaW5pdGlhbGl6ZXIiLG89ImRlc3RydWN0b3IiLHU9WyJfUExVRyIsIl9VTlBMVUciXSxhO3IuX2J1aWxkPWZ1bmN0aW9uKHQsbixpLHUsYSxmKXt2YXIgbD1yLl9idWlsZCxjPWwuX2N0b3IobixmKSxoPWwuX2NmZyhuLGYsaSkscD1sLl9taXhDdXN0LGQ9Yy5feXVpYnVpbGQuZHluYW1pYyx2LG0sZyx5LGIsdztmb3Iodj0wLG09aS5sZW5ndGg7djxtO3YrKylnPWlbdl0seT1nLnByb3RvdHlwZSxiPXlbc10sdz15W29dLGRlbGV0ZSB5W3NdLGRlbGV0ZSB5W29dLGUubWl4KGMsZywhMCxudWxsLDEpLHAoYyxnLGgpLGImJih5W3NdPWIpLHcmJih5W29dPXcpLGMuX3l1aWJ1aWxkLmV4dHMucHVzaChnKTtyZXR1cm4gdSYmZS5taXgoYy5wcm90b3R5cGUsdSwhMCksYSYmKGUubWl4KGMsbC5fY2xlYW4oYSxoKSwhMCkscChjLGEsaCkpLGMucHJvdG90eXBlLmhhc0ltcGw9bC5faW1wbCxkJiYoYy5OQU1FPXQsYy5wcm90b3R5cGUuY29uc3RydWN0b3I9YyxjLm1vZGlmeUF0dHJzPW4ubW9kaWZ5QXR0cnMpLGN9LGE9ci5fYnVpbGQsZS5taXgoYSx7X21peEN1c3Q6ZnVuY3Rpb24odCxuLHIpe3ZhciBzLG8sdSxhLGYsbDtyJiYocz1yLmFnZ3JlZ2F0ZXMsbz1yLmN1c3RvbSx1PXIuc3RhdGljcyksdSYmZS5taXgodCxuLCEwLHUpO2lmKHMpZm9yKGw9MCxmPXMubGVuZ3RoO2w8ZjtsKyspYT1zW2xdLCF0Lmhhc093blByb3BlcnR5KGEpJiZuLmhhc093blByb3BlcnR5KGEpJiYodFthXT1pLmlzQXJyYXkoblthXSk/W106e30pLGUuYWdncmVnYXRlKHQsbiwhMCxbYV0pO2lmKG8pZm9yKGwgaW4gbylvLmhhc093blByb3BlcnR5KGwpJiZvW2xdKGwsdCxuKX0sX3RtcGw6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbigpe24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGUuZXh0ZW5kKG4sdCksbn0sX2ltcGw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0Q2xhc3NlcygpLG4scixpLHMsbyx1O2ZvcihuPTAscj10Lmxlbmd0aDtuPHI7bisrKXtpPXRbbl07aWYoaS5feXVpYnVpbGQpe3M9aS5feXVpYnVpbGQuZXh0cyxvPXMubGVuZ3RoO2Zvcih1PTA7dTxvO3UrKylpZihzW3VdPT09ZSlyZXR1cm4hMH19cmV0dXJuITF9LF9jdG9yOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCYmITE9PT10LmR5bmFtaWM/ITE6ITAscj1uP2EuX3RtcGwoZSk6ZSxpPXIuX3l1aWJ1aWxkO3JldHVybiBpfHwoaT1yLl95dWlidWlsZD17fSksaS5pZD1pLmlkfHxudWxsLGkuZXh0cz1pLmV4dHN8fFtdLGkuZHluYW1pYz1uLHJ9LF9jZmc6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPVtdLHM9e30sbz1bXSx1LGE9biYmbi5hZ2dyZWdhdGVzLGY9biYmbi5jdXN0b20sbD1uJiZuLnN0YXRpY3MsYz10LGgscDt3aGlsZShjJiZjLnByb3RvdHlwZSl1PWMuX2J1aWxkQ2ZnLHUmJih1LmFnZ3JlZ2F0ZXMmJihpPWkuY29uY2F0KHUuYWdncmVnYXRlcykpLHUuY3VzdG9tJiZlLm1peChzLHUuY3VzdG9tLCEwKSx1LnN0YXRpY3MmJihvPW8uY29uY2F0KHUuc3RhdGljcykpKSxjPWMuc3VwZXJjbGFzcz9jLnN1cGVyY2xhc3MuY29uc3RydWN0b3I6bnVsbDtpZihyKWZvcihoPTAscD1yLmxlbmd0aDtoPHA7aCsrKWM9cltoXSx1PWMuX2J1aWxkQ2ZnLHUmJih1LmFnZ3JlZ2F0ZXMmJihpPWkuY29uY2F0KHUuYWdncmVnYXRlcykpLHUuY3VzdG9tJiZlLm1peChzLHUuY3VzdG9tLCEwKSx1LnN0YXRpY3MmJihvPW8uY29uY2F0KHUuc3RhdGljcykpKTtyZXR1cm4gYSYmKGk9aS5jb25jYXQoYSkpLGYmJmUubWl4KHMsbi5jZmdCdWlsZCwhMCksbCYmKG89by5jb25jYXQobCkpLHthZ2dyZWdhdGVzOmksY3VzdG9tOnMsc3RhdGljczpvfX0sX2NsZWFuOmZ1bmN0aW9uKHQsbil7dmFyIHIsaSxzLG89ZS5tZXJnZSh0KSx1PW4uYWdncmVnYXRlcyxhPW4uY3VzdG9tO2ZvcihyIGluIGEpby5oYXNPd25Qcm9wZXJ0eShyKSYmZGVsZXRlIG9bcl07Zm9yKGk9MCxzPXUubGVuZ3RoO2k8cztpKyspcj11W2ldLG8uaGFzT3duUHJvcGVydHkocikmJmRlbGV0ZSBvW3JdO3JldHVybiBvfX0pLHIuYnVpbGQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGEoZSx0LG4sbnVsbCxudWxsLHIpfSxyLmNyZWF0ZT1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBhKGUsdCxuLHIsaSl9LHIubWl4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX0NBQ0hFRF9DTEFTU19EQVRBJiYoZS5fQ0FDSEVEX0NMQVNTX0RBVEE9bnVsbCksYShudWxsLGUsdCxudWxsLG51bGwse2R5bmFtaWM6ITF9KX0sbi5fYnVpbGRDZmc9e2FnZ3JlZ2F0ZXM6dS5jb25jYXQoKSxjdXN0b206e0FUVFJTOmMsX0FUVFJfQ0ZHOmwsX05PTl9BVFRSU19DRkc6Zn19LHIuX2J1aWxkQ2ZnPXthZ2dyZWdhdGVzOnUuY29uY2F0KCksY3VzdG9tOntBVFRSUzpjLF9BVFRSX0NGRzpsLF9OT05fQVRUUlNfQ0ZHOmZ9fX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiYmFzZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LXN5bnRoZXRpYyIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBjKGUsdCl7dGhpcy5oYW5kbGU9ZSx0aGlzLmVtaXRGYWNhZGU9dH1mdW5jdGlvbiBoKGUsdCxuKXt0aGlzLmhhbmRsZXM9W10sdGhpcy5lbD1lLHRoaXMua2V5PW4sdGhpcy5kb21rZXk9dH1mdW5jdGlvbiBwKCl7dGhpcy5faW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIG49ZS5DdXN0b21FdmVudCxyPWUuRW52LmV2dC5kb21fbWFwLGk9ZS5BcnJheSxzPWUuTGFuZyxvPXMuaXNPYmplY3QsdT1zLmlzU3RyaW5nLGE9cy5pc0FycmF5LGY9ZS5TZWxlY3Rvci5xdWVyeSxsPWZ1bmN0aW9uKCl7fTtjLnByb3RvdHlwZS5maXJlPWZ1bmN0aW9uKHQpe3ZhciBuPWkoYXJndW1lbnRzLDAsITApLHI9dGhpcy5oYW5kbGUscz1yLmV2dCx1PXIuc3ViLGE9dS5jb250ZXh0LGY9dS5maWx0ZXIsbD10fHx7fSxjO2lmKHRoaXMuZW1pdEZhY2FkZSl7aWYoIXR8fCF0LnByZXZlbnREZWZhdWx0KWw9cy5fZ2V0RmFjYWRlKCksbyh0KSYmIXQucHJldmVudERlZmF1bHQ/KGUubWl4KGwsdCwhMCksblswXT1sKTpuLnVuc2hpZnQobCk7bC50eXBlPXMudHlwZSxsLmRldGFpbHM9bi5zbGljZSgpLGYmJihsLmNvbnRhaW5lcj1zLmhvc3QpfWVsc2UgZiYmbyh0KSYmdC5jdXJyZW50VGFyZ2V0JiZuLnNoaWZ0KCk7cmV0dXJuIHUuY29udGV4dD1hfHxsLmN1cnJlbnRUYXJnZXR8fHMuaG9zdCxjPXMuZmlyZS5hcHBseShzLG4pLHQucHJldmVudGVkJiZzLnByZXZlbnRlZEZuJiZzLnByZXZlbnRlZEZuLmFwcGx5KHMsbiksdC5zdG9wcGVkJiZzLnN0b3BwZWRGbiYmcy5zdG9wcGVkRm4uYXBwbHkocyxuKSx1LmNvbnRleHQ9YSxjfSxoLnByb3RvdHlwZT17Y29uc3RydWN0b3I6aCx0eXBlOiJfc3ludGgiLGZuOmwsY2FwdHVyZTohMSxyZWdpc3RlcjpmdW5jdGlvbihlKXtlLmV2dC5yZWdpc3RyeT10aGlzLHRoaXMuaGFuZGxlcy5wdXNoKGUpfSx1bnJlZ2lzdGVyOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuaGFuZGxlcyxpPXJbdGhpcy5kb21rZXldLHM7Zm9yKHM9bi5sZW5ndGgtMTtzPj0wOy0tcylpZihuW3NdLnN1Yj09PXQpe24uc3BsaWNlKHMsMSk7YnJlYWt9bi5sZW5ndGh8fChkZWxldGUgaVt0aGlzLmtleV0sZS5PYmplY3Quc2l6ZShpKXx8ZGVsZXRlIHJbdGhpcy5kb21rZXldKX0sZGV0YWNoQWxsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oYW5kbGVzLHQ9ZS5sZW5ndGg7d2hpbGUoLS10Pj0wKWVbdF0uZGV0YWNoKCl9fSxlLm1peChwLHtOb3RpZmllcjpjLFN5bnRoUmVnaXN0cnk6aCxnZXRSZWdpc3RyeTpmdW5jdGlvbih0LG4saSl7dmFyIHM9dC5fbm9kZSxvPWUuc3RhbXAocyksdT0iZXZlbnQ6IitvK24rIl9zeW50aCIsYT1yW29dO3JldHVybiBpJiYoYXx8KGE9cltvXT17fSksYVt1XXx8KGFbdV09bmV3IGgocyxvLHUpKSksYSYmYVt1XXx8bnVsbH0sX2RlbGV0ZVN1YjpmdW5jdGlvbihlKXtpZihlJiZlLmZuKXt2YXIgdD10aGlzLmV2ZW50RGVmLHI9ZS5maWx0ZXI/ImRldGFjaERlbGVnYXRlIjoiZGV0YWNoIjt0aGlzLl9zdWJzY3JpYmVycz1bXSxuLmtlZXBEZXByZWNhdGVkU3VicyYmKHRoaXMuc3Vic2NyaWJlcnM9e30pLHRbcl0oZS5ub2RlLGUsdGhpcy5ub3RpZmllcixlLmZpbHRlciksdGhpcy5yZWdpc3RyeS51bnJlZ2lzdGVyKGUpLGRlbGV0ZSBlLmZuLGRlbGV0ZSBlLm5vZGUsZGVsZXRlIGUuY29udGV4dH19LHByb3RvdHlwZTp7Y29uc3RydWN0b3I6cCxfaW5pdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHVibGlzaENvbmZpZ3x8KHRoaXMucHVibGlzaENvbmZpZz17fSk7dGhpcy5lbWl0RmFjYWRlPSJlbWl0RmFjYWRlImluIGU/ZS5lbWl0RmFjYWRlOiEwLGUuZW1pdEZhY2FkZT0hMX0scHJvY2Vzc0FyZ3M6bCxvbjpsLGRldGFjaDpsLGRlbGVnYXRlOmwsZGV0YWNoRGVsZWdhdGU6bCxfb246ZnVuY3Rpb24odCxuKXt2YXIgcj1bXSxzPXQuc2xpY2UoKSxvPXRoaXMucHJvY2Vzc0FyZ3ModCxuKSxhPXRbMl0sbD1uPyJkZWxlZ2F0ZSI6Im9uIixjLGg7cmV0dXJuIGM9dShhKT9mKGEpOmkoYXx8ZS5vbmUoZS5jb25maWcud2luKSksIWMubGVuZ3RoJiZ1KGEpPyhoPWUub24oImF2YWlsYWJsZSIsZnVuY3Rpb24oKXtlLm1peChoLGVbbF0uYXBwbHkoZSxzKSwhMCl9LGEpLGgpOihlLkFycmF5LmVhY2goYyxmdW5jdGlvbihpKXt2YXIgcz10LnNsaWNlKCksdTtpPWUub25lKGkpLGkmJihuJiYodT1zLnNwbGljZSgzLDEpWzBdKSxzLnNwbGljZSgwLDQsc1sxXSxzWzNdKSwoIXRoaXMucHJldmVudER1cHN8fCF0aGlzLmdldFN1YnMoaSx0LG51bGwsITApKSYmci5wdXNoKHRoaXMuX3N1YnNjcmliZShpLGwscyxvLHUpKSl9LHRoaXMpLHIubGVuZ3RoPT09MT9yWzBdOm5ldyBlLkV2ZW50SGFuZGxlKHIpKX0sX3N1YnNjcmliZTpmdW5jdGlvbih0LG4scixpLHMpe3ZhciBvPW5ldyBlLkN1c3RvbUV2ZW50KHRoaXMudHlwZSx0aGlzLnB1Ymxpc2hDb25maWcpLHU9by5vbi5hcHBseShvLHIpLGE9bmV3IGModSx0aGlzLmVtaXRGYWNhZGUpLGY9cC5nZXRSZWdpc3RyeSh0LHRoaXMudHlwZSwhMCksbD11LnN1YjtyZXR1cm4gbC5ub2RlPXQsbC5maWx0ZXI9cyxpJiZ0aGlzLmFwcGx5QXJnRXh0cmFzKGksbCksZS5taXgobyx7ZXZlbnREZWY6dGhpcyxub3RpZmllcjphLGhvc3Q6dCxjdXJyZW50VGFyZ2V0OnQsdGFyZ2V0OnQsZWw6dC5fbm9kZSxfZGVsZXRlOnAuX2RlbGV0ZVN1Yn0sITApLHUubm90aWZpZXI9YSxmLnJlZ2lzdGVyKHUpLHRoaXNbbl0odCxsLGEscyksdX0sYXBwbHlBcmdFeHRyYXM6ZnVuY3Rpb24oZSx0KXt0Ll9leHRyYT1lfSxfZGV0YWNoOmZ1bmN0aW9uKHQpe3ZhciBuPXRbMl0scj11KG4pP2Yobik6aShuKSxzLG8sYSxsLGM7dC5zcGxpY2UoMiwxKTtmb3Iobz0wLGE9ci5sZW5ndGg7bzxhOysrbyl7cz1lLm9uZShyW29dKTtpZihzKXtsPXRoaXMuZ2V0U3VicyhzLHQpO2lmKGwpZm9yKGM9bC5sZW5ndGgtMTtjPj0wOy0tYylsW2NdLmRldGFjaCgpfX19LGdldFN1YnM6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9cC5nZXRSZWdpc3RyeShlLHRoaXMudHlwZSkscz1bXSxvLHUsYSxmO2lmKGkpe289aS5oYW5kbGVzLG58fChuPXRoaXMuc3ViTWF0Y2gpO2Zvcih1PTAsYT1vLmxlbmd0aDt1PGE7Kyt1KXtmPW9bdV07aWYobi5jYWxsKHRoaXMsZi5zdWIsdCkpe2lmKHIpcmV0dXJuIGY7cy5wdXNoKG9bdV0pfX19cmV0dXJuIHMubGVuZ3RoJiZzfSxzdWJNYXRjaDpmdW5jdGlvbihlLHQpe3JldHVybiF0WzFdfHxlLmZuPT09dFsxXX19fSwhMCksZS5TeW50aGV0aWNFdmVudD1wLGUuRXZlbnQuZGVmaW5lPWZ1bmN0aW9uKHQsbixyKXt2YXIgcyxvLGY7dCYmdC50eXBlPyhzPXQscj1uKTpuJiYocz1lLm1lcmdlKHt0eXBlOnR9LG4pKTtpZihzKXtpZihyfHwhZS5Ob2RlLkRPTV9FVkVOVFNbcy50eXBlXSlvPWZ1bmN0aW9uKCl7cC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZXh0ZW5kKG8scCxzKSxmPW5ldyBvLHQ9Zi50eXBlLGUuTm9kZS5ET01fRVZFTlRTW3RdPWUuRW52LmV2dC5wbHVnaW5zW3RdPXtldmVudERlZjpmLG9uOmZ1bmN0aW9uKCl7cmV0dXJuIGYuX29uKGkoYXJndW1lbnRzKSl9LGRlbGVnYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuX29uKGkoYXJndW1lbnRzKSwhMCl9LGRldGFjaDpmdW5jdGlvbigpe3JldHVybiBmLl9kZXRhY2goaShhcmd1bWVudHMpKX19fWVsc2UodSh0KXx8YSh0KSkmJmUuQXJyYXkuZWFjaChpKHQpLGZ1bmN0aW9uKHQpe2UuTm9kZS5ET01fRVZFTlRTW3RdPTF9KTtyZXR1cm4gZn19LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWN1c3RvbS1jb21wbGV4Il19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImF0dHJpYnV0ZS1jb21wbGV4IixmdW5jdGlvbihlLHQpe3ZhciBuPWUuQXR0cmlidXRlO24uQ29tcGxleD1mdW5jdGlvbigpe30sbi5Db21wbGV4LnByb3RvdHlwZT17X25vcm1BdHRyVmFsczpuLnByb3RvdHlwZS5fbm9ybUF0dHJWYWxzLF9nZXRBdHRySW5pdFZhbDpuLnByb3RvdHlwZS5fZ2V0QXR0ckluaXRWYWx9LGUuQXR0cmlidXRlQ29tcGxleD1uLkNvbXBsZXh9LCIzLjE3LjIiLHtyZXF1aXJlczpbImF0dHJpYnV0ZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LW1vdXNlZW50ZXIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5FbnYuZXZ0LmRvbV93cmFwcGVycyxyPWUuRE9NLmNvbnRhaW5zLGk9ZS5BcnJheSxzPWZ1bmN0aW9uKCl7fSxvPXtwcm94eVR5cGU6Im1vdXNlb3ZlciIscmVsUHJvcGVydHk6ImZyb21FbGVtZW50Iixfbm90aWZ5OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbz10aGlzLl9ub2RlLHU9dC5yZWxhdGVkVGFyZ2V0fHx0W2ldO28hPT11JiYhcihvLHUpJiZzLmZpcmUobmV3IGUuRE9NRXZlbnRGYWNhZGUodCxvLG5bImV2ZW50OiIrZS5zdGFtcChvKSt0LnR5cGVdKSl9LG9uOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLk5vZGUuZ2V0RE9NTm9kZSh0KSxzPVt0aGlzLnByb3h5VHlwZSx0aGlzLl9ub3RpZnksaSxudWxsLHRoaXMucmVsUHJvcGVydHkscl07bi5oYW5kbGU9ZS5FdmVudC5fYXR0YWNoKHMse2ZhY2FkZTohMX0pfSxkZXRhY2g6ZnVuY3Rpb24oZSx0KXt0LmhhbmRsZS5kZXRhY2goKX0sZGVsZWdhdGU6ZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89ZS5Ob2RlLmdldERPTU5vZGUodCksdT1bdGhpcy5wcm94eVR5cGUscyxvLG51bGwscl07bi5oYW5kbGU9ZS5FdmVudC5fYXR0YWNoKHUse2ZhY2FkZTohMX0pLG4uaGFuZGxlLnN1Yi5maWx0ZXI9aSxuLmhhbmRsZS5zdWIucmVsUHJvcGVydHk9dGhpcy5yZWxQcm9wZXJ0eSxuLmhhbmRsZS5zdWIuX25vdGlmeT10aGlzLl9maWx0ZXJOb3RpZnl9LF9maWx0ZXJOb3RpZnk6ZnVuY3Rpb24odCxuLHMpe249bi5zbGljZSgpLHRoaXMuYXJncyYmbi5wdXNoLmFwcGx5KG4sdGhpcy5hcmdzKTt2YXIgbz1lLmRlbGVnYXRlLl9hcHBseUZpbHRlcih0aGlzLmZpbHRlcixuLHMpLHU9blswXS5yZWxhdGVkVGFyZ2V0fHxuWzBdW3RoaXMucmVsUHJvcGVydHldLGEsZixsLGMsaDtpZihvKXtvPWkobyk7Zm9yKGY9MCxsPW8ubGVuZ3RoJiYoIWF8fCFhLnN0b3BwZWQpO2Y8bDsrK2Ype2g9b1swXTtpZighcihoLHUpKXthfHwoYT1uZXcgZS5ET01FdmVudEZhY2FkZShuWzBdLGgscyksYS5jb250YWluZXI9ZS5vbmUocy5lbCkpLGEuY3VycmVudFRhcmdldD1lLm9uZShoKSxjPW5bMV0uZmlyZShhKTtpZihjPT09ITEpYnJlYWt9fX1yZXR1cm4gY30sZGV0YWNoRGVsZWdhdGU6ZnVuY3Rpb24oZSx0KXt0LmhhbmRsZS5kZXRhY2goKX19O2UuRXZlbnQuZGVmaW5lKCJtb3VzZWVudGVyIixvLCEwKSxlLkV2ZW50LmRlZmluZSgibW91c2VsZWF2ZSIsZS5tZXJnZShvLHtwcm94eVR5cGU6Im1vdXNlb3V0IixyZWxQcm9wZXJ0eToidG9FbGVtZW50In0pLCEwKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LWtleSIsZnVuY3Rpb24oZSx0KXt2YXIgbj0iK2FsdCIscj0iK2N0cmwiLGk9IittZXRhIixzPSIrc2hpZnQiLG89ZS5MYW5nLnRyaW0sdT17S0VZX01BUDp7ZW50ZXI6MTMsc3BhY2U6MzIsZXNjOjI3LGJhY2tzcGFjZTo4LHRhYjo5LHBhZ2V1cDozMyxwYWdlZG93bjozNH0sX3R5cGVSRTovXih1cHxkb3dufHByZXNzKTovLF9rZXlzUkU6L14oPzp1cHxkb3dufHByZXNzKTp8XCsoYWx0fGN0cmx8bWV0YXxzaGlmdCkvZyxwcm9jZXNzQXJnczpmdW5jdGlvbih0KXt2YXIgbj10LnNwbGljZSgzLDEpWzBdLHI9ZS5BcnJheS5oYXNoKG4ubWF0Y2goL1wrKD86YWx0fGN0cmx8bWV0YXxzaGlmdClcYi9nKXx8W10pLGk9e3R5cGU6dGhpcy5fdHlwZVJFLnRlc3Qobik/UmVnRXhwLiQxOm51bGwsbW9kczpyLGtleXM6bnVsbH0scz1uLnJlcGxhY2UodGhpcy5fa2V5c1JFLCIiKSx1LGEsZixsO2lmKHMpe3M9cy5zcGxpdCgiLCIpLGkua2V5cz17fTtmb3IobD1zLmxlbmd0aC0xO2w+PTA7LS1sKXt1PW8oc1tsXSk7aWYoIXUpY29udGludWU7K3U9PXU/aS5rZXlzW3VdPXI6KGY9dS50b0xvd2VyQ2FzZSgpLHRoaXMuS0VZX01BUFtmXT8oaS5rZXlzW3RoaXMuS0VZX01BUFtmXV09cixpLnR5cGV8fChpLnR5cGU9ImRvd24iKSk6KHU9dS5jaGFyQXQoMCksYT11LnRvVXBwZXJDYXNlKCksclsiK3NoaWZ0Il0mJih1PWEpLGkua2V5c1t1LmNoYXJDb2RlQXQoMCldPXU9PT1hP2UubWVyZ2Uocix7IitzaGlmdCI6ITB9KTpyKSl9fXJldHVybiBpLnR5cGV8fChpLnR5cGU9InByZXNzIiksaX0sb246ZnVuY3Rpb24oZSx0LG8sdSl7dmFyIGE9dC5fZXh0cmEsZj0ia2V5IithLnR5cGUsbD1hLmtleXMsYz11PyJkZWxlZ2F0ZSI6Im9uIjt0Ll9kZXRhY2g9ZVtjXShmLGZ1bmN0aW9uKGUpe3ZhciB0PWw/bFtlLndoaWNoXTphLm1vZHM7dCYmKCF0W25dfHx0W25dJiZlLmFsdEtleSkmJighdFtyXXx8dFtyXSYmZS5jdHJsS2V5KSYmKCF0W2ldfHx0W2ldJiZlLm1ldGFLZXkpJiYoIXRbc118fHRbc10mJmUuc2hpZnRLZXkpJiZvLmZpcmUoZSl9LHUpfSxkZXRhY2g6ZnVuY3Rpb24oZSx0LG4pe3QuX2RldGFjaC5kZXRhY2goKX19O3UuZGVsZWdhdGU9dS5vbix1LmRldGFjaERlbGVnYXRlPXUuZGV0YWNoLGUuRXZlbnQuZGVmaW5lKCJrZXkiLHUsITApfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1zeW50aGV0aWMiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiZXZlbnQtb3V0c2lkZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1bImJsdXIiLCJjaGFuZ2UiLCJjbGljayIsImRibGNsaWNrIiwiZm9jdXMiLCJrZXlkb3duIiwia2V5cHJlc3MiLCJrZXl1cCIsIm1vdXNlZG93biIsIm1vdXNlbW92ZSIsIm1vdXNlb3V0IiwibW91c2VvdmVyIiwibW91c2V1cCIsInNlbGVjdCIsInN1Ym1pdCJdO2UuRXZlbnQuZGVmaW5lT3V0c2lkZT1mdW5jdGlvbih0LG4pe249bnx8dCsib3V0c2lkZSI7dmFyIHI9e29uOmZ1bmN0aW9uKG4scixpKXtyLmhhbmRsZT1lLm9uZSgiZG9jIikub24odCxmdW5jdGlvbihlKXt0aGlzLmlzT3V0c2lkZShuLGUudGFyZ2V0KSYmKGUuY3VycmVudFRhcmdldD1uLGkuZmlyZShlKSl9LHRoaXMpfSxkZXRhY2g6ZnVuY3Rpb24oZSx0LG4pe3QuaGFuZGxlLmRldGFjaCgpfSxkZWxlZ2F0ZTpmdW5jdGlvbihuLHIsaSxzKXtyLmhhbmRsZT1lLm9uZSgiZG9jIikuZGVsZWdhdGUodCxmdW5jdGlvbihlKXt0aGlzLmlzT3V0c2lkZShuLGUudGFyZ2V0KSYmaS5maXJlKGUpfSxzLHRoaXMpfSxpc091dHNpZGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCE9PWUmJiF0LmFuY2VzdG9yKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZX0pfX07ci5kZXRhY2hEZWxlZ2F0ZT1yLmRldGFjaCxlLkV2ZW50LmRlZmluZShuLHIpfSxlLkFycmF5LmVhY2gobixmdW5jdGlvbih0KXtlLkV2ZW50LmRlZmluZU91dHNpZGUodCl9KX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LWZvY3VzIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHUodCxyLHUpe3ZhciBhPSJfIit0KyJOb3RpZmllcnMiO2UuRXZlbnQuZGVmaW5lKHQse191c2VBY3RpdmF0ZTpvLF9hdHRhY2g6ZnVuY3Rpb24oaSxzLG8pe3JldHVybiBlLkRPTS5pc1dpbmRvdyhpKT9uLl9hdHRhY2goW3QsZnVuY3Rpb24oZSl7cy5maXJlKGUpfSxpXSk6bi5fYXR0YWNoKFtyLHRoaXMuX3Byb3h5LGksdGhpcyxzLG9dLHtjYXB0dXJlOiEwfSl9LF9wcm94eTpmdW5jdGlvbih0LHIsaSl7dmFyIHM9dC50YXJnZXQsZj10LmN1cnJlbnRUYXJnZXQsbD1zLmdldERhdGEoYSksYz1lLnN0YW1wKGYuX25vZGUpLGg9b3x8cyE9PWYscDtyLmN1cnJlbnRUYXJnZXQ9aT9zOmYsci5jb250YWluZXI9aT9mOm51bGwsbD9oPSEwOihsPXt9LHMuc2V0RGF0YShhLGwpLGgmJihwPW4uX2F0dGFjaChbdSx0aGlzLl9ub3RpZnkscy5fbm9kZV0pLnN1YixwLm9uY2U9ITApKSxsW2NdfHwobFtjXT1bXSksbFtjXS5wdXNoKHIpLGh8fHRoaXMuX25vdGlmeSh0KX0sX25vdGlmeTpmdW5jdGlvbih0LG4pe3ZhciByPXQuY3VycmVudFRhcmdldCxpPXIuZ2V0RGF0YShhKSxvPXIuYW5jZXN0b3JzKCksdT1yLmdldCgib3duZXJEb2N1bWVudCIpLGY9W10sbD1pP2UuT2JqZWN0LmtleXMoaSkubGVuZ3RoOjAsYyxoLHAsZCx2LG0sZyx5LGIsdztyLmNsZWFyRGF0YShhKSxvLnB1c2gociksdSYmby51bnNoaWZ0KHUpLG8uX25vZGVzLnJldmVyc2UoKSxsJiYobT1sLG8uc29tZShmdW5jdGlvbih0KXt2YXIgbj1lLnN0YW1wKHQpLHI9aVtuXSxzLG87aWYocil7bC0tO2ZvcihzPTAsbz1yLmxlbmd0aDtzPG87KytzKXJbc10uaGFuZGxlLnN1Yi5maWx0ZXImJmYucHVzaChyW3NdKX1yZXR1cm4hbH0pLGw9bSk7d2hpbGUobCYmKGM9by5zaGlmdCgpKSl7ZD1lLnN0YW1wKGMpLGg9aVtkXTtpZihoKXtmb3IoZz0wLHk9aC5sZW5ndGg7Zzx5OysrZyl7cD1oW2ddLGI9cC5oYW5kbGUuc3ViLHY9ITAsdC5jdXJyZW50VGFyZ2V0PWMsYi5maWx0ZXImJih2PWIuZmlsdGVyLmFwcGx5KGMsW2MsdF0uY29uY2F0KGIuYXJnc3x8W10pKSxmLnNwbGljZShzKGYscCksMSkpLHYmJih0LmNvbnRhaW5lcj1wLmNvbnRhaW5lcix3PXAuZmlyZSh0KSk7aWYodz09PSExfHx0LnN0b3BwZWQ9PT0yKWJyZWFrfWRlbGV0ZSBoW2RdLGwtLX1pZih0LnN0b3BwZWQhPT0yKWZvcihnPTAseT1mLmxlbmd0aDtnPHk7KytnKXtwPWZbZ10sYj1wLmhhbmRsZS5zdWIsYi5maWx0ZXIuYXBwbHkoYyxbYyx0XS5jb25jYXQoYi5hcmdzfHxbXSkpJiYodC5jb250YWluZXI9cC5jb250YWluZXIsdC5jdXJyZW50VGFyZ2V0PWMsdz1wLmZpcmUodCkpO2lmKHc9PT0hMXx8dC5zdG9wcGVkPT09Mnx8dC5zdG9wcGVkJiZmW2crMV0mJmZbZysxXS5jb250YWluZXIhPT1wLmNvbnRhaW5lcilicmVha31pZih0LnN0b3BwZWQpYnJlYWt9fSxvbjpmdW5jdGlvbihlLHQsbil7dC5oYW5kbGU9dGhpcy5fYXR0YWNoKGUuX25vZGUsbil9LGRldGFjaDpmdW5jdGlvbihlLHQpe3QuaGFuZGxlLmRldGFjaCgpfSxkZWxlZ2F0ZTpmdW5jdGlvbih0LG4scixzKXtpKHMpJiYobi5maWx0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGUuU2VsZWN0b3IudGVzdChuLl9ub2RlLHMsdD09PW4/bnVsbDp0Ll9ub2RlKX0pLG4uaGFuZGxlPXRoaXMuX2F0dGFjaCh0Ll9ub2RlLHIsITApfSxkZXRhY2hEZWxlZ2F0ZTpmdW5jdGlvbihlLHQpe3QuaGFuZGxlLmRldGFjaCgpfX0sITApfXZhciBuPWUuRXZlbnQscj1lLkxhbmcsaT1yLmlzU3RyaW5nLHM9ZS5BcnJheS5pbmRleE9mLG89ZnVuY3Rpb24oKXt2YXIgdD0hMSxuPWUuY29uZmlnLmRvYyxyO3JldHVybiBuJiYocj1uLmNyZWF0ZUVsZW1lbnQoInAiKSxyLnNldEF0dHJpYnV0ZSgib25iZWZvcmVhY3RpdmF0ZSIsIjsiKSx0PXIub25iZWZvcmVhY3RpdmF0ZSE9PXVuZGVmaW5lZCksdH0oKTtvPyh1KCJmb2N1cyIsImJlZm9yZWFjdGl2YXRlIiwiZm9jdXNpbiIpLHUoImJsdXIiLCJiZWZvcmVkZWFjdGl2YXRlIiwiZm9jdXNvdXQiKSk6KHUoImZvY3VzIiwiZm9jdXMiLCJmb2N1cyIpLHUoImJsdXIiLCJibHVyIiwiYmx1ciIpKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImNsYXNzbmFtZW1hbmFnZXIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ImNsYXNzTmFtZVByZWZpeCIscj0iY2xhc3NOYW1lRGVsaW1pdGVyIixpPWUuY29uZmlnO2lbbl09aVtuXXx8Inl1aTMiLGlbcl09aVtyXXx8Ii0iLGUuQ2xhc3NOYW1lTWFuYWdlcj1mdW5jdGlvbigpe3ZhciB0PWlbbl0scz1pW3JdO3JldHVybntnZXRDbGFzc05hbWU6ZS5jYWNoZWQoZnVuY3Rpb24oKXt2YXIgbj1lLkFycmF5KGFyZ3VtZW50cyk7cmV0dXJuIG5bbi5sZW5ndGgtMV0hPT0hMD9uLnVuc2hpZnQodCk6bi5wb3AoKSxuLmpvaW4ocyl9KX19KCl9LCIzLjE3LjIiLHtyZXF1aXJlczpbInl1aS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIndpZGdldC1iYXNlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIFIoZSl7dmFyIHQ9dGhpcyxuLHIsaT10LmNvbnN0cnVjdG9yO3QuX3N0cnM9e30sdC5fY3NzUHJlZml4PWkuQ1NTX1BSRUZJWHx8cyhpLk5BTUUudG9Mb3dlckNhc2UoKSksZT1lfHx7fSxSLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0LGUpLHI9dC5nZXQoVCksciYmKHIhPT1QJiYobj1yKSx0LnJlbmRlcihuKSl9dmFyIG49ZS5MYW5nLHI9ZS5Ob2RlLGk9ZS5DbGFzc05hbWVNYW5hZ2VyLHM9aS5nZXRDbGFzc05hbWUsbyx1PWUuY2FjaGVkKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSl9KSxhPSJjb250ZW50IixmPSJ2aXNpYmxlIixsPSJoaWRkZW4iLGM9ImRpc2FibGVkIixoPSJmb2N1c2VkIixwPSJ3aWR0aCIsZD0iaGVpZ2h0Iix2PSJib3VuZGluZ0JveCIsbT0iY29udGVudEJveCIsZz0icGFyZW50Tm9kZSIseT0ib3duZXJEb2N1bWVudCIsYj0iYXV0byIsdz0ic3JjTm9kZSIsRT0iYm9keSIsUz0idGFiSW5kZXgiLHg9ImlkIixUPSJyZW5kZXIiLE49InJlbmRlcmVkIixDPSJkZXN0cm95ZWQiLGs9InN0cmluZ3MiLEw9IjxkaXY+PC9kaXY+IixBPSJDaGFuZ2UiLE89ImxvYWRpbmciLE09Il91aVNldCIsXz0iIixEPWZ1bmN0aW9uKCl7fSxQPSEwLEg9ITEsQixqPXt9LEY9W2YsYyxkLHAsaCxTXSxJPWUuVUEud2Via2l0LHE9e307Ui5OQU1FPSJ3aWRnZXQiLEI9Ui5VSV9TUkM9InVpIixSLkFUVFJTPWosalt4XT17dmFsdWVGbjoiX2d1aWQiLHdyaXRlT25jZTpQfSxqW05dPXt2YWx1ZTpILHJlYWRPbmx5OlB9LGpbdl09e3ZhbHVlRm46Il9kZWZhdWx0QkIiLHNldHRlcjoiX3NldEJCIix3cml0ZU9uY2U6UH0salttXT17dmFsdWVGbjoiX2RlZmF1bHRDQiIsc2V0dGVyOiJfc2V0Q0IiLHdyaXRlT25jZTpQfSxqW1NdPXt2YWx1ZTpudWxsLHZhbGlkYXRvcjoiX3ZhbGlkVGFiSW5kZXgifSxqW2hdPXt2YWx1ZTpILHJlYWRPbmx5OlB9LGpbY109e3ZhbHVlOkh9LGpbZl09e3ZhbHVlOlB9LGpbZF09e3ZhbHVlOl99LGpbcF09e3ZhbHVlOl99LGpba109e3ZhbHVlOnt9LHNldHRlcjoiX3N0clNldHRlciIsZ2V0dGVyOiJfc3RyR2V0dGVyIn0saltUXT17dmFsdWU6SCx3cml0ZU9uY2U6UH0sUi5DU1NfUFJFRklYPXMoUi5OQU1FLnRvTG93ZXJDYXNlKCkpLFIuZ2V0Q2xhc3NOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHMuYXBwbHkoaSxbUi5DU1NfUFJFRklYXS5jb25jYXQoZS5BcnJheShhcmd1bWVudHMpLCEwKSl9LG89Ui5nZXRDbGFzc05hbWUsUi5nZXRCeU5vZGU9ZnVuY3Rpb24odCl7dmFyIG4saT1vKCk7cmV0dXJuIHQ9ci5vbmUodCksdCYmKHQ9dC5hbmNlc3RvcigiLiIraSwhMCksdCYmKG49cVtlLnN0YW1wKHQsITApXSkpLG58fG51bGx9LGUuZXh0ZW5kKFIsZS5CYXNlLHtnZXRDbGFzc05hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gcy5hcHBseShpLFt0aGlzLl9jc3NQcmVmaXhdLmNvbmNhdChlLkFycmF5KGFyZ3VtZW50cyksITApKX0saW5pdGlhbGl6ZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5nZXQodik7biBpbnN0YW5jZW9mIHImJnRoaXMuX21hcEluc3RhbmNlKGUuc3RhbXAobikpfSxfbWFwSW5zdGFuY2U6ZnVuY3Rpb24oZSl7cVtlXT10aGlzfSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQodiksbjt0IGluc3RhbmNlb2YgciYmKG49ZS5zdGFtcCh0LCEwKSxuIGluIHEmJmRlbGV0ZSBxW25dLHRoaXMuX2Rlc3Ryb3lCb3goKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2Rlc3Ryb3lBbGxOb2Rlcz1lLFIuc3VwZXJjbGFzcy5kZXN0cm95LmFwcGx5KHRoaXMpfSxfZGVzdHJveUJveDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHYpLHQ9dGhpcy5nZXQobSksbj10aGlzLl9kZXN0cm95QWxsTm9kZXMscjtyPWUmJmUuY29tcGFyZVRvKHQpLHRoaXMuVUlfRVZFTlRTJiZ0aGlzLl9kZXN0cm95VUlFdmVudHMoKSx0aGlzLl91bmJpbmRVSShlKSx0JiYobiYmdC5lbXB0eSgpLHQucmVtb3ZlKFApKSxyfHwobiYmZS5lbXB0eSgpLGUucmVtb3ZlKFApKX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiF0aGlzLmdldChDKSYmIXRoaXMuZ2V0KE4pJiYodGhpcy5wdWJsaXNoKFQse3F1ZXVhYmxlOkgsZmlyZU9uY2U6UCxkZWZhdWx0VGFyZ2V0T25seTpQLGRlZmF1bHRGbjp0aGlzLl9kZWZSZW5kZXJGbn0pLHRoaXMuZmlyZShULHtwYXJlbnROb2RlOmU/ci5vbmUoZSk6bnVsbH0pKSx0aGlzfSxfZGVmUmVuZGVyRm46ZnVuY3Rpb24oZSl7dGhpcy5fcGFyZW50Tm9kZT1lLnBhcmVudE5vZGUsdGhpcy5yZW5kZXJlcigpLHRoaXMuX3NldChOLFApLHRoaXMuX3JlbW92ZUxvYWRpbmdDbGFzc05hbWVzKCl9LHJlbmRlcmVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLl9yZW5kZXJVSSgpLGUucmVuZGVyVUkoKSxlLl9iaW5kVUkoKSxlLmJpbmRVSSgpLGUuX3N5bmNVSSgpLGUuc3luY1VJKCl9LGJpbmRVSTpELHJlbmRlclVJOkQsc3luY1VJOkQsaGlkZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldChmLEgpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0KGYsUCl9LGZvY3VzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldChoLFApfSxibHVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldChoLEgpfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXQoYyxIKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldChjLFApfSxfdWlTaXplQ0I6ZnVuY3Rpb24oZSl7dGhpcy5nZXQobSkudG9nZ2xlQ2xhc3MobyhhLCJleHBhbmRlZCIpLGUpfSxfcmVuZGVyQm94OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10LmdldChtKSxpPXQuZ2V0KHYpLHM9dC5nZXQodyksbz10LkRFRl9QQVJFTlRfTk9ERSx1PXMmJnMuZ2V0KHkpfHxpLmdldCh5KXx8bi5nZXQoeSk7cyYmIXMuY29tcGFyZVRvKG4pJiYhbi5pbkRvYyh1KSYmcy5yZXBsYWNlKG4pLCFpLmNvbXBhcmVUbyhuLmdldChnKSkmJiFpLmNvbXBhcmVUbyhuKSYmKG4uaW5Eb2ModSkmJm4ucmVwbGFjZShpKSxpLmFwcGVuZENoaWxkKG4pKSxlPWV8fG8mJnIub25lKG8pLGU/ZS5hcHBlbmRDaGlsZChpKTppLmluRG9jKHUpfHxyLm9uZShFKS5pbnNlcnQoaSwwKX0sX3NldEJCOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZXRCb3godGhpcy5nZXQoeCksZSx0aGlzLkJPVU5ESU5HX1RFTVBMQVRFLCEwKX0sX3NldENCOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLkNPTlRFTlRfVEVNUExBVEU9PT1udWxsP3RoaXMuZ2V0KHYpOnRoaXMuX3NldEJveChudWxsLGUsdGhpcy5DT05URU5UX1RFTVBMQVRFLCExKX0sX2RlZmF1bHRCQjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHcpLHQ9dGhpcy5DT05URU5UX1RFTVBMQVRFPT09bnVsbDtyZXR1cm4gZSYmdD9lOm51bGx9LF9kZWZhdWx0Q0I6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0KHcpfHxudWxsfSxfc2V0Qm94OmZ1bmN0aW9uKHQsbixpLHMpe3JldHVybiBuPXIub25lKG4pLG58fChuPXIuY3JlYXRlKGkpLHM/dGhpcy5fYmJGcm9tVGVtcGxhdGU9ITA6dGhpcy5fY2JGcm9tVGVtcGxhdGU9ITApLG4uZ2V0KHgpfHxuLnNldCh4LHR8fGUuZ3VpZCgpKSxufSxfcmVuZGVyVUk6ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJCb3hDbGFzc05hbWVzKCksdGhpcy5fcmVuZGVyQm94KHRoaXMuX3BhcmVudE5vZGUpfSxfcmVuZGVyQm94Q2xhc3NOYW1lczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2dldENsYXNzZXMoKSx0LG49dGhpcy5nZXQodikscjtuLmFkZENsYXNzKG8oKSk7Zm9yKHI9ZS5sZW5ndGgtMztyPj0wO3ItLSl0PWVbcl0sbi5hZGRDbGFzcyh0LkNTU19QUkVGSVh8fHModC5OQU1FLnRvTG93ZXJDYXNlKCkpKTt0aGlzLmdldChtKS5hZGRDbGFzcyh0aGlzLmdldENsYXNzTmFtZShhKSl9LF9yZW1vdmVMb2FkaW5nQ2xhc3NOYW1lczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHYpLHQ9dGhpcy5nZXQobSksbj10aGlzLmdldENsYXNzTmFtZShPKSxyPW8oTyk7ZS5yZW1vdmVDbGFzcyhyKS5yZW1vdmVDbGFzcyhuKSx0LnJlbW92ZUNsYXNzKHIpLnJlbW92ZUNsYXNzKG4pfSxfYmluZFVJOmZ1bmN0aW9uKCl7dGhpcy5fYmluZEF0dHJVSSh0aGlzLl9VSV9BVFRSUy5CSU5EKSx0aGlzLl9iaW5kRE9NKCl9LF91bmJpbmRVSTpmdW5jdGlvbihlKXt0aGlzLl91bmJpbmRET00oZSl9LF9iaW5kRE9NOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQodikuZ2V0KHkpLG49Ui5faERvY0ZvY3VzO258fChuPVIuX2hEb2NGb2N1cz10Lm9uKCJmb2N1cyIsdGhpcy5fb25Eb2NGb2N1cyx0aGlzKSxuLmxpc3RlbmVycz17Y291bnQ6MH0pLG4ubGlzdGVuZXJzW2Uuc3RhbXAodGhpcywhMCldPSEwLG4ubGlzdGVuZXJzLmNvdW50KyssSSYmKHRoaXMuX2hEb2NNb3VzZURvd249dC5vbigibW91c2Vkb3duIix0aGlzLl9vbkRvY01vdXNlRG93bix0aGlzKSl9LF91bmJpbmRET006ZnVuY3Rpb24odCl7dmFyIG49Ui5faERvY0ZvY3VzLHI9ZS5zdGFtcCh0aGlzLCEwKSxpLHM9dGhpcy5faERvY01vdXNlRG93bjtuJiYoaT1uLmxpc3RlbmVycyxpW3JdJiYoZGVsZXRlIGlbcl0saS5jb3VudC0tKSxpLmNvdW50PT09MCYmKG4uZGV0YWNoKCksUi5faERvY0ZvY3VzPW51bGwpKSxJJiZzJiZzLmRldGFjaCgpfSxfc3luY1VJOmZ1bmN0aW9uKCl7dGhpcy5fc3luY0F0dHJVSSh0aGlzLl9VSV9BVFRSUy5TWU5DKX0sX3VpU2V0SGVpZ2h0OmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0RGltKGQsZSksdGhpcy5fdWlTaXplQ0IoZSE9PV8mJmUhPT1iKX0sX3VpU2V0V2lkdGg6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXREaW0ocCxlKX0sX3VpU2V0RGltOmZ1bmN0aW9uKGUsdCl7dGhpcy5nZXQodikuc2V0U3R5bGUoZSxuLmlzTnVtYmVyKHQpP3QrdGhpcy5ERUZfVU5JVDp0KX0sX3VpU2V0VmlzaWJsZTpmdW5jdGlvbihlKXt0aGlzLmdldCh2KS50b2dnbGVDbGFzcyh0aGlzLmdldENsYXNzTmFtZShsKSwhZSl9LF91aVNldERpc2FibGVkOmZ1bmN0aW9uKGUpe3RoaXMuZ2V0KHYpLnRvZ2dsZUNsYXNzKHRoaXMuZ2V0Q2xhc3NOYW1lKGMpLGUpfSxfdWlTZXRGb2N1c2VkOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXQodik7bi50b2dnbGVDbGFzcyh0aGlzLmdldENsYXNzTmFtZShoKSxlKSx0IT09QiYmKGU/bi5mb2N1cygpOm4uYmx1cigpKX0sX3VpU2V0VGFiSW5kZXg6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXQodik7bi5pc051bWJlcihlKT90LnNldChTLGUpOnQucmVtb3ZlQXR0cmlidXRlKFMpfSxfb25Eb2NNb3VzZURvd246ZnVuY3Rpb24oZSl7dGhpcy5fZG9tRm9jdXMmJnRoaXMuX29uRG9jRm9jdXMoZSl9LF9vbkRvY0ZvY3VzOmZ1bmN0aW9uKGUpe3ZhciB0PVIuZ2V0QnlOb2RlKGUudGFyZ2V0KSxuPVIuX2FjdGl2ZTtuJiZuIT09dCYmKG4uX2RvbUZvY3VzPSExLG4uX3NldChoLCExLHtzcmM6Qn0pLFIuX2FjdGl2ZT1udWxsKSx0JiYodC5fZG9tRm9jdXM9ITAsdC5fc2V0KGgsITAse3NyYzpCfSksUi5fYWN0aXZlPXQpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIlsiK3RoaXMuZ2V0KHgpKyJdIn0sREVGX1VOSVQ6InB4IixERUZfUEFSRU5UX05PREU6bnVsbCxDT05URU5UX1RFTVBMQVRFOkwsQk9VTkRJTkdfVEVNUExBVEU6TCxfZ3VpZDpmdW5jdGlvbigpe3JldHVybiBlLmd1aWQoKX0sX3ZhbGlkVGFiSW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIG4uaXNOdW1iZXIoZSl8fG4uaXNOdWxsKGUpfSxfYmluZEF0dHJVSTpmdW5jdGlvbihlKXt2YXIgdCxuPWUubGVuZ3RoO2Zvcih0PTA7dDxuO3QrKyl0aGlzLmFmdGVyKGVbdF0rQSx0aGlzLl9zZXRBdHRyVUkpfSxfc3luY0F0dHJVSTpmdW5jdGlvbihlKXt2YXIgdCxuPWUubGVuZ3RoLHI7Zm9yKHQ9MDt0PG47dCsrKXI9ZVt0XSx0aGlzW00rdShyKV0odGhpcy5nZXQocikpfSxfc2V0QXR0clVJOmZ1bmN0aW9uKGUpe2UudGFyZ2V0PT09dGhpcyYmdGhpc1tNK3UoZS5hdHRyTmFtZQopXShlLm5ld1ZhbCxlLnNyYyl9LF9zdHJTZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGUubWVyZ2UodGhpcy5nZXQoayksdCl9LGdldFN0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXQoaylbZV19LGdldFN0cmluZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoayl9LF9VSV9BVFRSUzp7QklORDpGLFNZTkM6Rn19KSxlLldpZGdldD1SfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJhdHRyaWJ1dGUiLCJiYXNlLWJhc2UiLCJiYXNlLXBsdWdpbmhvc3QiLCJjbGFzc25hbWVtYW5hZ2VyIiwiZXZlbnQtZm9jdXMiLCJub2RlLWJhc2UiLCJub2RlLXN0eWxlIl0sc2tpbm5hYmxlOiEwfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtaHRtbHBhcnNlciIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLldpZGdldCxyPWUuTm9kZSxpPWUuTGFuZyxzPSJzcmNOb2RlIixvPSJjb250ZW50Qm94IjtuLkhUTUxfUEFSU0VSPXt9LG4uX2J1aWxkQ2ZnPXthZ2dyZWdhdGVzOlsiSFRNTF9QQVJTRVIiXX0sbi5BVFRSU1tzXT17dmFsdWU6bnVsbCxzZXR0ZXI6ci5vbmUsZ2V0dGVyOiJfZ2V0U3JjTm9kZSIsd3JpdGVPbmNlOiEwfSxlLm1peChuLnByb3RvdHlwZSx7X2dldFNyY05vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGV8fHRoaXMuZ2V0KG8pfSxfcHJlQWRkQXR0cnM6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXtpZDplLmlkLGJvdW5kaW5nQm94OmUuYm91bmRpbmdCb3gsY29udGVudEJveDplLmNvbnRlbnRCb3gsc3JjTm9kZTplLnNyY05vZGV9O3RoaXMuYWRkQXR0cnMocix0LG4pLGRlbGV0ZSBlLmJvdW5kaW5nQm94LGRlbGV0ZSBlLmNvbnRlbnRCb3gsZGVsZXRlIGUuc3JjTm9kZSxkZWxldGUgZS5pZCx0aGlzLl9hcHBseVBhcnNlciYmdGhpcy5fYXBwbHlQYXJzZXIodCl9LF9hcHBseVBhcnNlZENvbmZpZzpmdW5jdGlvbih0LG4scil7cmV0dXJuIHI/ZS5taXgobixyLCExKTpufSxfYXBwbHlQYXJzZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPXRoaXMuX2dldE5vZGVUb1BhcnNlKCkscz1uLl9nZXRIdG1sUGFyc2VyKCksbyx1O3MmJnImJmUuT2JqZWN0LmVhY2gocyxmdW5jdGlvbihlLHQscyl7dT1udWxsLGkuaXNGdW5jdGlvbihlKT91PWUuY2FsbChuLHIpOmkuaXNBcnJheShlKT8odT1yLmFsbChlWzBdKSx1LmlzRW1wdHkoKSYmKHU9bnVsbCkpOnU9ci5vbmUoZSksdSE9PW51bGwmJnUhPT11bmRlZmluZWQmJihvPW98fHt9LG9bdF09dSl9KSx0PW4uX2FwcGx5UGFyc2VkQ29uZmlnKHIsdCxvKX0sX2dldE5vZGVUb1BhcnNlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXQoInNyY05vZGUiKTtyZXR1cm4gdGhpcy5fY2JGcm9tVGVtcGxhdGU/bnVsbDplfSxfZ2V0SHRtbFBhcnNlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldENsYXNzZXMoKSxuPXt9LHIsaTtmb3Iocj10Lmxlbmd0aC0xO3I+PTA7ci0tKWk9dFtyXS5IVE1MX1BBUlNFUixpJiZlLm1peChuLGksITApO3JldHVybiBufX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ3aWRnZXQtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtc2tpbiIsZnVuY3Rpb24oZSx0KXt2YXIgbj0iYm91bmRpbmdCb3giLHI9ImNvbnRlbnRCb3giLGk9InNraW4iLHM9ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZTtlLldpZGdldC5wcm90b3R5cGUuZ2V0U2tpbk5hbWU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXQocil8fHRoaXMuZ2V0KG4pLG8sdTtyZXR1cm4gZT1lfHxzKGksIiIpLHU9bmV3IFJlZ0V4cCgiXFxiIitlKyIoXFxTKykiKSx0JiZ0LmFuY2VzdG9yKGZ1bmN0aW9uKGUpe3JldHVybiBvPWUuZ2V0KCJjbGFzc05hbWUiKS5tYXRjaCh1KSxvfSksbz9vWzFdOm51bGx9fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ3aWRnZXQtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtdWlldmVudHMiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ImJvdW5kaW5nQm94IixyPWUuV2lkZ2V0LGk9InJlbmRlciIscz1lLkxhbmcsbz0iOiIsdT1lLldpZGdldC5fdWlldnRzPWUuV2lkZ2V0Ll91aWV2dHN8fHt9O2UubWl4KHIucHJvdG90eXBlLHtfZGVzdHJveVVJRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5zdGFtcCh0aGlzLCEwKTtlLmVhY2godSxmdW5jdGlvbihuLHIpe24uaW5zdGFuY2VzW3RdJiYoZGVsZXRlIG4uaW5zdGFuY2VzW3RdLGUuT2JqZWN0LmlzRW1wdHkobi5pbnN0YW5jZXMpJiYobi5oYW5kbGUuZGV0YWNoKCksdVtyXSYmZGVsZXRlIHVbcl0pKX0pfSxVSV9FVkVOVFM6ZS5Ob2RlLkRPTV9FVkVOVFMsX2dldFVJRXZlbnROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KG4pfSxfY3JlYXRlVUlFdmVudDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRVSUV2ZW50Tm9kZSgpLGk9ZS5zdGFtcChuKSt0LHM9dVtpXSxvO3N8fChvPW4uZGVsZWdhdGUodCxmdW5jdGlvbihlKXt2YXIgdD1yLmdldEJ5Tm9kZSh0aGlzKTt0JiZ0Ll9maWx0ZXJVSUV2ZW50KGUpJiZ0LmZpcmUoZS50eXBlLHtkb21FdmVudDplfSl9LCIuIitlLldpZGdldC5nZXRDbGFzc05hbWUoKSksdVtpXT1zPXtpbnN0YW5jZXM6e30saGFuZGxlOm99KSxzLmluc3RhbmNlc1tlLnN0YW1wKHRoaXMpXT0xfSxfZmlsdGVyVUlFdmVudDpmdW5jdGlvbihlKXtyZXR1cm4gZS5jdXJyZW50VGFyZ2V0LmNvbXBhcmVUbyhlLmNvbnRhaW5lcil8fGUuY29udGFpbmVyLmNvbXBhcmVUbyh0aGlzLl9nZXRVSUV2ZW50Tm9kZSgpKX0sX2dldFVJRXZlbnQ6ZnVuY3Rpb24oZSl7aWYocy5pc1N0cmluZyhlKSl7dmFyIHQ9dGhpcy5wYXJzZVR5cGUoZSlbMV0sbixyO3JldHVybiB0JiYobj10LmluZGV4T2Yobyksbj4tMSYmKHQ9dC5zdWJzdHJpbmcobitvLmxlbmd0aCkpLHRoaXMuVUlfRVZFTlRTW3RdJiYocj10KSkscn19LF9pbml0VUlFdmVudDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRVSUV2ZW50KGUpLG49dGhpcy5fdWlFdnRzSW5pdFF1ZXVlfHx7fTt0JiYhblt0XSYmKHRoaXMuX3VpRXZ0c0luaXRRdWV1ZT1uW3RdPTEsdGhpcy5hZnRlcihpLGZ1bmN0aW9uKCl7dGhpcy5fY3JlYXRlVUlFdmVudCh0KSxkZWxldGUgdGhpcy5fdWlFdnRzSW5pdFF1ZXVlW3RdfSkpfSxvbjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faW5pdFVJRXZlbnQoZSksci5zdXBlcmNsYXNzLm9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scHVibGlzaDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2dldFVJRXZlbnQoZSk7cmV0dXJuIG4mJnQmJnQuZGVmYXVsdEZuJiZ0aGlzLl9pbml0VUlFdmVudChuKSxyLnN1cGVyY2xhc3MucHVibGlzaC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSwhMCl9LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUtZXZlbnQtZGVsZWdhdGUiLCJ3aWRnZXQtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtc3RkbW9kIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIEgoZSl7fXZhciBuPWUuTGFuZyxyPWUuTm9kZSxpPWUuVUEscz1lLldpZGdldCxvPSIiLHU9ImhkIixhPSJiZCIsZj0iZnQiLGw9ImhlYWRlciIsYz0iYm9keSIsaD0iZm9vdGVyIixwPSJmaWxsSGVpZ2h0IixkPSJzdGRtb2QiLHY9Ik5vZGUiLG09IkNvbnRlbnQiLGc9ImZpcnN0Q2hpbGQiLHk9ImNoaWxkTm9kZXMiLGI9Im93bmVyRG9jdW1lbnQiLHc9ImNvbnRlbnRCb3giLEU9ImhlaWdodCIsUz0ib2Zmc2V0SGVpZ2h0Iix4PSJhdXRvIixUPSJoZWFkZXJDb250ZW50Q2hhbmdlIixOPSJib2R5Q29udGVudENoYW5nZSIsQz0iZm9vdGVyQ29udGVudENoYW5nZSIsaz0iZmlsbEhlaWdodENoYW5nZSIsTD0iaGVpZ2h0Q2hhbmdlIixBPSJjb250ZW50VXBkYXRlIixPPSJyZW5kZXJVSSIsTT0iYmluZFVJIixfPSJzeW5jVUkiLEQ9Il9hcHBseVBhcnNlZENvbmZpZyIsUD1lLldpZGdldC5VSV9TUkM7SC5IRUFERVI9bCxILkJPRFk9YyxILkZPT1RFUj1oLEguQUZURVI9ImFmdGVyIixILkJFRk9SRT0iYmVmb3JlIixILlJFUExBQ0U9InJlcGxhY2UiO3ZhciBCPUguSEVBREVSLGo9SC5CT0RZLEY9SC5GT09URVIsST1CK20scT1GK20sUj1qK207SC5BVFRSUz17aGVhZGVyQ29udGVudDp7dmFsdWU6bnVsbH0sZm9vdGVyQ29udGVudDp7dmFsdWU6bnVsbH0sYm9keUNvbnRlbnQ6e3ZhbHVlOm51bGx9LGZpbGxIZWlnaHQ6e3ZhbHVlOkguQk9EWSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlRmlsbEhlaWdodChlKX19fSxILkhUTUxfUEFSU0VSPXtoZWFkZXJDb250ZW50OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wYXJzZVN0ZE1vZEhUTUwoQil9LGJvZHlDb250ZW50OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wYXJzZVN0ZE1vZEhUTUwoail9LGZvb3RlckNvbnRlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3BhcnNlU3RkTW9kSFRNTChGKX19LEguU0VDVElPTl9DTEFTU19OQU1FUz17aGVhZGVyOnMuZ2V0Q2xhc3NOYW1lKHUpLGJvZHk6cy5nZXRDbGFzc05hbWUoYSksZm9vdGVyOnMuZ2V0Q2xhc3NOYW1lKGYpfSxILlRFTVBMQVRFUz17aGVhZGVyOic8ZGl2IGNsYXNzPSInK0guU0VDVElPTl9DTEFTU19OQU1FU1tCXSsnIj48L2Rpdj4nLGJvZHk6JzxkaXYgY2xhc3M9IicrSC5TRUNUSU9OX0NMQVNTX05BTUVTW2pdKyciPjwvZGl2PicsZm9vdGVyOic8ZGl2IGNsYXNzPSInK0guU0VDVElPTl9DTEFTU19OQU1FU1tGXSsnIj48L2Rpdj4nfSxILnByb3RvdHlwZT17aW5pdGlhbGl6ZXI6ZnVuY3Rpb24oKXt0aGlzLl9zdGRNb2ROb2RlPXRoaXMuZ2V0KHcpLGUuYmVmb3JlKHRoaXMuX3JlbmRlclVJU3RkTW9kLHRoaXMsTyksZS5iZWZvcmUodGhpcy5fYmluZFVJU3RkTW9kLHRoaXMsTSksZS5iZWZvcmUodGhpcy5fc3luY1VJU3RkTW9kLHRoaXMsXyl9LF9zeW5jVUlTdGRNb2Q6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9zdGRNb2RQYXJzZWQ7KCFlfHwhZVtJXSkmJnRoaXMuX3VpU2V0U3RkTW9kKEIsdGhpcy5nZXQoSSkpLCghZXx8IWVbUl0pJiZ0aGlzLl91aVNldFN0ZE1vZChqLHRoaXMuZ2V0KFIpKSwoIWV8fCFlW3FdKSYmdGhpcy5fdWlTZXRTdGRNb2QoRix0aGlzLmdldChxKSksdGhpcy5fdWlTZXRGaWxsSGVpZ2h0KHRoaXMuZ2V0KHApKX0sX3JlbmRlclVJU3RkTW9kOmZ1bmN0aW9uKCl7dGhpcy5fc3RkTW9kTm9kZS5hZGRDbGFzcyhzLmdldENsYXNzTmFtZShkKSksdGhpcy5fcmVuZGVyU3RkTW9kU2VjdGlvbnMoKSx0aGlzLmFmdGVyKFQsdGhpcy5fYWZ0ZXJIZWFkZXJDaGFuZ2UpLHRoaXMuYWZ0ZXIoTix0aGlzLl9hZnRlckJvZHlDaGFuZ2UpLHRoaXMuYWZ0ZXIoQyx0aGlzLl9hZnRlckZvb3RlckNoYW5nZSl9LF9yZW5kZXJTdGRNb2RTZWN0aW9uczpmdW5jdGlvbigpe24uaXNWYWx1ZSh0aGlzLmdldChJKSkmJnRoaXMuX3JlbmRlclN0ZE1vZChCKSxuLmlzVmFsdWUodGhpcy5nZXQoUikpJiZ0aGlzLl9yZW5kZXJTdGRNb2Qoaiksbi5pc1ZhbHVlKHRoaXMuZ2V0KHEpKSYmdGhpcy5fcmVuZGVyU3RkTW9kKEYpfSxfYmluZFVJU3RkTW9kOmZ1bmN0aW9uKCl7dGhpcy5hZnRlcihrLHRoaXMuX2FmdGVyRmlsbEhlaWdodENoYW5nZSksdGhpcy5hZnRlcihMLHRoaXMuX2ZpbGxIZWlnaHQpLHRoaXMuYWZ0ZXIoQSx0aGlzLl9maWxsSGVpZ2h0KX0sX2FmdGVySGVhZGVyQ2hhbmdlOmZ1bmN0aW9uKGUpe2Uuc3JjIT09UCYmdGhpcy5fdWlTZXRTdGRNb2QoQixlLm5ld1ZhbCxlLnN0ZE1vZFBvc2l0aW9uKX0sX2FmdGVyQm9keUNoYW5nZTpmdW5jdGlvbihlKXtlLnNyYyE9PVAmJnRoaXMuX3VpU2V0U3RkTW9kKGosZS5uZXdWYWwsZS5zdGRNb2RQb3NpdGlvbil9LF9hZnRlckZvb3RlckNoYW5nZTpmdW5jdGlvbihlKXtlLnNyYyE9PVAmJnRoaXMuX3VpU2V0U3RkTW9kKEYsZS5uZXdWYWwsZS5zdGRNb2RQb3NpdGlvbil9LF9hZnRlckZpbGxIZWlnaHRDaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRGaWxsSGVpZ2h0KGUubmV3VmFsKX0sX3ZhbGlkYXRlRmlsbEhlaWdodDpmdW5jdGlvbihlKXtyZXR1cm4hZXx8ZT09SC5CT0RZfHxlPT1ILkhFQURFUnx8ZT09SC5GT09URVJ9LF91aVNldEZpbGxIZWlnaHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRTdGRNb2ROb2RlKGUpLG49dGhpcy5fY3VyckZpbGxOb2RlO24mJnQhPT1uJiZuLnNldFN0eWxlKEUsbyksdCYmKHRoaXMuX2N1cnJGaWxsTm9kZT10KSx0aGlzLl9maWxsSGVpZ2h0KCl9LF9maWxsSGVpZ2h0OmZ1bmN0aW9uKCl7aWYodGhpcy5nZXQocCkpe3ZhciBlPXRoaXMuZ2V0KEUpO2UhPW8mJmUhPXgmJnRoaXMuZmlsbEhlaWdodCh0aGlzLmdldFN0ZE1vZE5vZGUodGhpcy5nZXQocCkpKX19LF91aVNldFN0ZE1vZDpmdW5jdGlvbihlLHQscil7aWYobi5pc1ZhbHVlKHQpKXt2YXIgaT10aGlzLmdldFN0ZE1vZE5vZGUoZSwhMCk7dGhpcy5fYWRkU3RkTW9kQ29udGVudChpLHQsciksdGhpcy5zZXQoZSttLHRoaXMuX2dldFN0ZE1vZENvbnRlbnQoZSkse3NyYzpQfSl9ZWxzZSB0aGlzLl9lcmFzZVN0ZE1vZChlKTt0aGlzLmZpcmUoQSl9LF9yZW5kZXJTdGRNb2Q6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXQodyksbj10aGlzLl9maW5kU3RkTW9kU2VjdGlvbihlKTtyZXR1cm4gbnx8KG49dGhpcy5fZ2V0U3RkTW9kVGVtcGxhdGUoZSkpLHRoaXMuX2luc2VydFN0ZE1vZFNlY3Rpb24odCxlLG4pLHRoaXNbZSt2XT1uLHRoaXNbZSt2XX0sX2VyYXNlU3RkTW9kOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0U3RkTW9kTm9kZShlKTt0JiYodC5yZW1vdmUoITApLGRlbGV0ZSB0aGlzW2Urdl0pfSxfaW5zZXJ0U3RkTW9kU2VjdGlvbjpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXQoZyk7aWYodD09PUZ8fCFyKWUuYXBwZW5kQ2hpbGQobik7ZWxzZSBpZih0PT09QillLmluc2VydEJlZm9yZShuLHIpO2Vsc2V7dmFyIGk9dGhpc1tGK3ZdO2k/ZS5pbnNlcnRCZWZvcmUobixpKTplLmFwcGVuZENoaWxkKG4pfX0sX2dldFN0ZE1vZFRlbXBsYXRlOmZ1bmN0aW9uKGUpe3JldHVybiByLmNyZWF0ZShILlRFTVBMQVRFU1tlXSx0aGlzLl9zdGRNb2ROb2RlLmdldChiKSl9LF9hZGRTdGRNb2RDb250ZW50OmZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2gobil7Y2FzZSBILkJFRk9SRTpuPTA7YnJlYWs7Y2FzZSBILkFGVEVSOm49dW5kZWZpbmVkO2JyZWFrO2RlZmF1bHQ6bj1ILlJFUExBQ0V9ZS5pbnNlcnQodCxuKX0sX2dldFByZWNpc2VIZWlnaHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZT9lLmdldChTKTowLG49ImdldEJvdW5kaW5nQ2xpZW50UmVjdCI7aWYoZSYmZS5oYXNNZXRob2Qobikpe3ZhciByPWUuaW52b2tlKG4pO3ImJih0PXIuYm90dG9tLXIudG9wKX1yZXR1cm4gdH0sX2ZpbmRTdGRNb2RTZWN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldCh3KS5vbmUoIj4gLiIrSC5TRUNUSU9OX0NMQVNTX05BTUVTW2VdKX0sX3BhcnNlU3RkTW9kSFRNTDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9maW5kU3RkTW9kU2VjdGlvbih0KTtyZXR1cm4gbj8odGhpcy5fc3RkTW9kUGFyc2VkfHwodGhpcy5fc3RkTW9kUGFyc2VkPXt9LGUuYmVmb3JlKHRoaXMuX2FwcGx5U3RkTW9kUGFyc2VkQ29uZmlnLHRoaXMsRCkpLHRoaXMuX3N0ZE1vZFBhcnNlZFt0K21dPTEsbi5nZXQoImlubmVySFRNTCIpKTpudWxsfSxfYXBwbHlTdGRNb2RQYXJzZWRDb25maWc6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX3N0ZE1vZFBhcnNlZDtyJiYocltJXT0hKEkgaW4gdCkmJkkgaW4gcixyW1JdPSEoUiBpbiB0KSYmUiBpbiByLHJbcV09IShxIGluIHQpJiZxIGluIHIpfSxfZ2V0U3RkTW9kQ29udGVudDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpc1tlK3ZdP3RoaXNbZSt2XS5nZXQoeSk6bnVsbH0sc2V0U3RkTW9kQ29udGVudDpmdW5jdGlvbihlLHQsbil7dGhpcy5zZXQoZSttLHQse3N0ZE1vZFBvc2l0aW9uOm59KX0sZ2V0U3RkTW9kTm9kZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbZSt2XXx8bnVsbDtyZXR1cm4hbiYmdCYmKG49dGhpcy5fcmVuZGVyU3RkTW9kKGUpKSxufSxmaWxsSGVpZ2h0OmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PXRoaXMuZ2V0KHcpLHI9W3RoaXMuaGVhZGVyTm9kZSx0aGlzLmJvZHlOb2RlLHRoaXMuZm9vdGVyTm9kZV0scyxvLHU9MCxhPTAsZj0hMTtmb3IodmFyIGw9MCxjPXIubGVuZ3RoO2w8YztsKyspcz1yW2xdLHMmJihzIT09ZT91Kz10aGlzLl9nZXRQcmVjaXNlSGVpZ2h0KHMpOmY9ITApO2YmJigoaS5pZXx8aS5vcGVyYSkmJmUuc2V0KFMsMCksbz10LmdldChTKS1wYXJzZUludCh0LmdldENvbXB1dGVkU3R5bGUoInBhZGRpbmdUb3AiKSwxMCktcGFyc2VJbnQodC5nZXRDb21wdXRlZFN0eWxlKCJwYWRkaW5nQm90dG9tIiksMTApLXBhcnNlSW50KHQuZ2V0Q29tcHV0ZWRTdHlsZSgiYm9yZGVyQm90dG9tV2lkdGgiKSwxMCktcGFyc2VJbnQodC5nZXRDb21wdXRlZFN0eWxlKCJib3JkZXJUb3BXaWR0aCIpLDEwKSxuLmlzTnVtYmVyKG8pJiYoYT1vLXUsYT49MCYmZS5zZXQoUyxhKSkpfX19LGUuV2lkZ2V0U3RkTW9kPUh9LCIzLjE3LjIiLHtyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJ3aWRnZXQiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgid2lkZ2V0LXBvc2l0aW9uIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGQoZSl7fXZhciBuPWUuTGFuZyxyPWUuV2lkZ2V0LGk9Inh5IixzPSJwb3NpdGlvbiIsbz0icG9zaXRpb25lZCIsdT0iYm91bmRpbmdCb3giLGE9InJlbGF0aXZlIixmPSJyZW5kZXJVSSIsbD0iYmluZFVJIixjPSJzeW5jVUkiLGg9ci5VSV9TUkMscD0ieHlDaGFuZ2UiO2QuQVRUUlM9e3g6e3NldHRlcjpmdW5jdGlvbihlKXt0aGlzLl9zZXRYKGUpfSxnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0WCgpfSxsYXp5QWRkOiExfSx5OntzZXR0ZXI6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0WShlKX0sZ2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFkoKX0sbGF6eUFkZDohMX0seHk6e3ZhbHVlOlswLDBdLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fdmFsaWRhdGVYWShlKX19fSxkLlBPU0lUSU9ORURfQ0xBU1NfTkFNRT1yLmdldENsYXNzTmFtZShvKSxkLnByb3RvdHlwZT17aW5pdGlhbGl6ZXI6ZnVuY3Rpb24oKXt0aGlzLl9wb3NOb2RlPXRoaXMuZ2V0KHUpLGUuYWZ0ZXIodGhpcy5fcmVuZGVyVUlQb3NpdGlvbix0aGlzLGYpLGUuYWZ0ZXIodGhpcy5fc3luY1VJUG9zaXRpb24sdGhpcyxjKSxlLmFmdGVyKHRoaXMuX2JpbmRVSVBvc2l0aW9uLHRoaXMsbCl9LF9yZW5kZXJVSVBvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fcG9zTm9kZS5hZGRDbGFzcyhkLlBPU0lUSU9ORURfQ0xBU1NfTkFNRSl9LF9zeW5jVUlQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3Bvc05vZGU7ZS5nZXRTdHlsZShzKT09PWEmJnRoaXMuc3luY1hZKCksdGhpcy5fdWlTZXRYWSh0aGlzLmdldChpKSl9LF9iaW5kVUlQb3NpdGlvbjpmdW5jdGlvbigpe3RoaXMuYWZ0ZXIocCx0aGlzLl9hZnRlclhZQ2hhbmdlKX0sbW92ZTpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cyx0PW4uaXNBcnJheShlWzBdKT9lWzBdOltlWzBdLGVbMV1dO3RoaXMuc2V0KGksdCl9LHN5bmNYWTpmdW5jdGlvbigpe3RoaXMuc2V0KGksdGhpcy5fcG9zTm9kZS5nZXRYWSgpLHtzcmM6aH0pfSxfdmFsaWRhdGVYWTpmdW5jdGlvbihlKXtyZXR1cm4gbi5pc0FycmF5KGUpJiZuLmlzTnVtYmVyKGVbMF0pJiZuLmlzTnVtYmVyKGVbMV0pfSxfc2V0WDpmdW5jdGlvbihlKXt0aGlzLnNldChpLFtlLHRoaXMuZ2V0KGkpWzFdXSl9LF9zZXRZOmZ1bmN0aW9uKGUpe3RoaXMuc2V0KGksW3RoaXMuZ2V0KGkpWzBdLGVdKX0sX2dldFg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoaSlbMF19LF9nZXRZOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KGkpWzFdfSxfYWZ0ZXJYWUNoYW5nZTpmdW5jdGlvbihlKXtlLnNyYyE9aCYmdGhpcy5fdWlTZXRYWShlLm5ld1ZhbCl9LF91aVNldFhZOmZ1bmN0aW9uKGUpe3RoaXMuX3Bvc05vZGUuc2V0WFkoZSl9fSxlLldpZGdldFBvc2l0aW9uPWR9LCIzLjE3LjIiLHtyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJub2RlLXNjcmVlbiIsIndpZGdldCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtcG9zaXRpb24tYWxpZ24iLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gYyhlKXt9dmFyIG49ZS5MYW5nLHI9ImFsaWduIixpPSJhbGlnbk9uIixzPSJ2aXNpYmxlIixvPSJib3VuZGluZ0JveCIsdT0ib2Zmc2V0V2lkdGgiLGE9Im9mZnNldEhlaWdodCIsZj0icmVnaW9uIixsPSJ2aWV3cG9ydFJlZ2lvbiI7Yy5BVFRSUz17YWxpZ246e3ZhbHVlOm51bGx9LGNlbnRlcmVkOntzZXR0ZXI6Il9zZXRBbGlnbkNlbnRlciIsbGF6eUFkZDohMSx2YWx1ZTohMX0sYWxpZ25Pbjp7dmFsdWU6W10sdmFsaWRhdG9yOmUuTGFuZy5pc0FycmF5fX0sYy5UTD0idGwiLGMuVFI9InRyIixjLkJMPSJibCIsYy5CUj0iYnIiLGMuVEM9InRjIixjLlJDPSJyYyIsYy5CQz0iYmMiLGMuTEM9ImxjIixjLkNDPSJjYyIsYy5wcm90b3R5cGU9e2luaXRpYWxpemVyOmZ1bmN0aW9uKCl7dGhpcy5fcG9zTm9kZXx8ZS5lcnJvcigiV2lkZ2V0UG9zaXRpb24gbmVlZHMgdG8gYmUgYWRkZWQgdG8gdGhlIFdpZGdldCwgYmVmb3JlIFdpZGdldFBvc2l0aW9uQWxpZ24gaXMgYWRkZWQiKSxlLmFmdGVyKHRoaXMuX2JpbmRVSVBvc0FsaWduLHRoaXMsImJpbmRVSSIpLGUuYWZ0ZXIodGhpcy5fc3luY1VJUG9zQWxpZ24sdGhpcywic3luY1VJIil9LF9wb3NBbGlnblVJSGFuZGxlczpudWxsLGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl9kZXRhY2hQb3NBbGlnblVJSGFuZGxlcygpfSxfYmluZFVJUG9zQWxpZ246ZnVuY3Rpb24oKXt0aGlzLmFmdGVyKCJhbGlnbkNoYW5nZSIsdGhpcy5fYWZ0ZXJBbGlnbkNoYW5nZSksdGhpcy5hZnRlcigiYWxpZ25PbkNoYW5nZSIsdGhpcy5fYWZ0ZXJBbGlnbk9uQ2hhbmdlKSx0aGlzLmFmdGVyKCJ2aXNpYmxlQ2hhbmdlIix0aGlzLl9zeW5jVUlQb3NBbGlnbil9LF9zeW5jVUlQb3NBbGlnbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHIpO3RoaXMuX3VpU2V0VmlzaWJsZVBvc0FsaWduKHRoaXMuZ2V0KHMpKSxlJiZ0aGlzLl91aVNldEFsaWduKGUubm9kZSxlLnBvaW50cyl9LGFsaWduOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5zZXQocix7bm9kZTplLHBvaW50czp0fSk6dGhpcy5fc3luY1VJUG9zQWxpZ24oKSx0aGlzfSxjZW50ZXJlZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hbGlnbihlLFtjLkNDLGMuQ0NdKX0sX3NldEFsaWduQ2VudGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlJiZ0aGlzLnNldChyLHtub2RlOmU9PT0hMD9udWxsOmUscG9pbnRzOltjLkNDLGMuQ0NdfSksZX0sX3VpU2V0QWxpZ246ZnVuY3Rpb24odCxyKXtpZighbi5pc0FycmF5KHIpfHxyLmxlbmd0aCE9PTIpe2UuZXJyb3IoImFsaWduOiBJbnZhbGlkIFBvaW50cyBBcmd1bWVudHMiKTtyZXR1cm59dmFyIGk9dGhpcy5fZ2V0UmVnaW9uKHQpLHMsbyx1O2lmKCFpKXJldHVybjtzPXJbMF0sbz1yWzFdO3N3aXRjaChvKXtjYXNlIGMuVEw6dT1baS5sZWZ0LGkudG9wXTticmVhaztjYXNlIGMuVFI6dT1baS5yaWdodCxpLnRvcF07YnJlYWs7Y2FzZSBjLkJMOnU9W2kubGVmdCxpLmJvdHRvbV07YnJlYWs7Y2FzZSBjLkJSOnU9W2kucmlnaHQsaS5ib3R0b21dO2JyZWFrO2Nhc2UgYy5UQzp1PVtpLmxlZnQrTWF0aC5mbG9vcihpLndpZHRoLzIpLGkudG9wXTticmVhaztjYXNlIGMuQkM6dT1baS5sZWZ0K01hdGguZmxvb3IoaS53aWR0aC8yKSxpLmJvdHRvbV07YnJlYWs7Y2FzZSBjLkxDOnU9W2kubGVmdCxpLnRvcCtNYXRoLmZsb29yKGkuaGVpZ2h0LzIpXTticmVhaztjYXNlIGMuUkM6dT1baS5yaWdodCxpLnRvcCtNYXRoLmZsb29yKGkuaGVpZ2h0LzIpXTticmVhaztjYXNlIGMuQ0M6dT1baS5sZWZ0K01hdGguZmxvb3IoaS53aWR0aC8yKSxpLnRvcCtNYXRoLmZsb29yKGkuaGVpZ2h0LzIpXTticmVhaztkZWZhdWx0On11JiZ0aGlzLl9kb0FsaWduKHMsdVswXSx1WzFdKX0sX3VpU2V0VmlzaWJsZVBvc0FsaWduOmZ1bmN0aW9uKGUpe2U/dGhpcy5fYXR0YWNoUG9zQWxpZ25VSUhhbmRsZXMoKTp0aGlzLl9kZXRhY2hQb3NBbGlnblVJSGFuZGxlcygpfSxfYXR0YWNoUG9zQWxpZ25VSUhhbmRsZXM6ZnVuY3Rpb24oKXtpZih0aGlzLl9wb3NBbGlnblVJSGFuZGxlcylyZXR1cm47dmFyIHQ9dGhpcy5nZXQobyksbj1lLmJpbmQodGhpcy5fc3luY1VJUG9zQWxpZ24sdGhpcykscj1bXTtlLkFycmF5LmVhY2godGhpcy5nZXQoaSksZnVuY3Rpb24oaSl7dmFyIHM9aS5ldmVudE5hbWUsbz1lLm9uZShpLm5vZGUpfHx0O3MmJnIucHVzaChvLm9uKHMsbikpfSksdGhpcy5fcG9zQWxpZ25VSUhhbmRsZXM9cn0sX2RldGFjaFBvc0FsaWduVUlIYW5kbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcG9zQWxpZ25VSUhhbmRsZXM7dCYmKChuZXcgZS5FdmVudEhhbmRsZSh0KSkuZGV0YWNoKCksdGhpcy5fcG9zQWxpZ25VSUhhbmRsZXM9bnVsbCl9LF9kb0FsaWduOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl9wb3NOb2RlLGk7c3dpdGNoKGUpe2Nhc2UgYy5UTDppPVt0LG5dO2JyZWFrO2Nhc2UgYy5UUjppPVt0LXIuZ2V0KHUpLG5dO2JyZWFrO2Nhc2UgYy5CTDppPVt0LG4tci5nZXQoYSldO2JyZWFrO2Nhc2UgYy5CUjppPVt0LXIuZ2V0KHUpLG4tci5nZXQoYSldO2JyZWFrO2Nhc2UgYy5UQzppPVt0LXIuZ2V0KHUpLzIsbl07YnJlYWs7Y2FzZSBjLkJDOmk9W3Qtci5nZXQodSkvMixuLXIuZ2V0KGEpXTticmVhaztjYXNlIGMuTEM6aT1bdCxuLXIuZ2V0KGEpLzJdO2JyZWFrO2Nhc2UgYy5SQzppPVt0LXIuZ2V0KHUpLG4tci5nZXQoYSkvMl07YnJlYWs7Y2FzZSBjLkNDOmk9W3Qtci5nZXQodSkvMixuLXIuZ2V0KGEpLzJdO2JyZWFrO2RlZmF1bHQ6fWkmJnRoaXMubW92ZShpKX0sX2dldFJlZ2lvbjpmdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4gdD8odD1lLk5vZGUub25lKHQpLHQmJihuPXQuZ2V0KGYpKSk6bj10aGlzLl9wb3NOb2RlLmdldChsKSxufSxfYWZ0ZXJBbGlnbkNoYW5nZTpmdW5jdGlvbihlKXt2YXIgdD1lLm5ld1ZhbDt0JiZ0aGlzLl91aVNldEFsaWduKHQubm9kZSx0LnBvaW50cyl9LF9hZnRlckFsaWduT25DaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5fZGV0YWNoUG9zQWxpZ25VSUhhbmRsZXMoKSx0aGlzLmdldChzKSYmdGhpcy5fYXR0YWNoUG9zQWxpZ25VSUhhbmRsZXMoKX19LGUuV2lkZ2V0UG9zaXRpb25BbGlnbj1jfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ3aWRnZXQtcG9zaXRpb24iXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgid2lkZ2V0LXN0YWNrIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIE8oZSl7fXZhciBuPWUuTGFuZyxyPWUuVUEsaT1lLk5vZGUscz1lLldpZGdldCxvPSJ6SW5kZXgiLHU9InNoaW0iLGE9InZpc2libGUiLGY9ImJvdW5kaW5nQm94IixsPSJyZW5kZXJVSSIsYz0iYmluZFVJIixoPSJzeW5jVUkiLHA9Im9mZnNldFdpZHRoIixkPSJvZmZzZXRIZWlnaHQiLHY9InBhcmVudE5vZGUiLG09ImZpcnN0Q2hpbGQiLGc9Im93bmVyRG9jdW1lbnQiLHk9IndpZHRoIixiPSJoZWlnaHQiLHc9InB4IixFPSJzaGltZGVmZXJyZWQiLFM9InNoaW1yZXNpemUiLHg9InZpc2libGVDaGFuZ2UiLFQ9IndpZHRoQ2hhbmdlIixOPSJoZWlnaHRDaGFuZ2UiLEM9InNoaW1DaGFuZ2UiLGs9InpJbmRleENoYW5nZSIsTD0iY29udGVudFVwZGF0ZSIsQT0ic3RhY2tlZCI7Ty5BVFRSUz17c2hpbTp7dmFsdWU6ci5pZT09Nn0sekluZGV4Ont2YWx1ZTowLHNldHRlcjoiX3NldFpJbmRleCJ9fSxPLkhUTUxfUEFSU0VSPXt6SW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3BhcnNlWkluZGV4KGUpfX0sTy5TSElNX0NMQVNTX05BTUU9cy5nZXRDbGFzc05hbWUodSksTy5TVEFDS0VEX0NMQVNTX05BTUU9cy5nZXRDbGFzc05hbWUoQSksTy5TSElNX1RFTVBMQVRFPSc8aWZyYW1lIGNsYXNzPSInK08uU0hJTV9DTEFTU19OQU1FKyciIGZyYW1lYm9yZGVyPSIwIiB0aXRsZT0iV2lkZ2V0IFN0YWNraW5nIFNoaW0iIHNyYz0iamF2YXNjcmlwdDpmYWxzZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJwcmVzZW50YXRpb24iPjwvaWZyYW1lPicsTy5wcm90b3R5cGU9e2luaXRpYWxpemVyOmZ1bmN0aW9uKCl7dGhpcy5fc3RhY2tOb2RlPXRoaXMuZ2V0KGYpLHRoaXMuX3N0YWNrSGFuZGxlcz17fSxlLmFmdGVyKHRoaXMuX3JlbmRlclVJU3RhY2ssdGhpcyxsKSxlLmFmdGVyKHRoaXMuX3N5bmNVSVN0YWNrLHRoaXMsaCksZS5hZnRlcih0aGlzLl9iaW5kVUlTdGFjayx0aGlzLGMpfSxfc3luY1VJU3RhY2s6ZnVuY3Rpb24oKXt0aGlzLl91aVNldFNoaW0odGhpcy5nZXQodSkpLHRoaXMuX3VpU2V0WkluZGV4KHRoaXMuZ2V0KG8pKX0sX2JpbmRVSVN0YWNrOmZ1bmN0aW9uKCl7dGhpcy5hZnRlcihDLHRoaXMuX2FmdGVyU2hpbUNoYW5nZSksdGhpcy5hZnRlcihrLHRoaXMuX2FmdGVyWkluZGV4Q2hhbmdlKX0sX3JlbmRlclVJU3RhY2s6ZnVuY3Rpb24oKXt0aGlzLl9zdGFja05vZGUuYWRkQ2xhc3MoTy5TVEFDS0VEX0NMQVNTX05BTUUpfSxfcGFyc2VaSW5kZXg6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIWUuaW5Eb2MoKXx8ZS5nZXRTdHlsZSgicG9zaXRpb24iKT09PSJzdGF0aWMiP3Q9ImF1dG8iOnQ9ZS5nZXRDb21wdXRlZFN0eWxlKCJ6SW5kZXgiKSx0PT09ImF1dG8iP251bGw6dH0sX3NldFpJbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gbi5pc1N0cmluZyhlKSYmKGU9cGFyc2VJbnQoZSwxMCkpLG4uaXNOdW1iZXIoZSl8fChlPTApLGV9LF9hZnRlclNoaW1DaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRTaGltKGUubmV3VmFsKX0sX2FmdGVyWkluZGV4Q2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0WkluZGV4KGUubmV3VmFsKX0sX3VpU2V0WkluZGV4OmZ1bmN0aW9uKGUpe3RoaXMuX3N0YWNrTm9kZS5zZXRTdHlsZShvLGUpfSxfdWlTZXRTaGltOmZ1bmN0aW9uKGUpe2U/KHRoaXMuZ2V0KGEpP3RoaXMuX3JlbmRlclNoaW0oKTp0aGlzLl9yZW5kZXJTaGltRGVmZXJyZWQoKSxyLmllPT02JiZ0aGlzLl9hZGRTaGltUmVzaXplSGFuZGxlcnMoKSk6dGhpcy5fZGVzdHJveVNoaW0oKX0sX3JlbmRlclNoaW1EZWZlcnJlZDpmdW5jdGlvbigpe3RoaXMuX3N0YWNrSGFuZGxlc1tFXT10aGlzLl9zdGFja0hhbmRsZXNbRV18fFtdO3ZhciBlPXRoaXMuX3N0YWNrSGFuZGxlc1tFXSx0PWZ1bmN0aW9uKGUpe2UubmV3VmFsJiZ0aGlzLl9yZW5kZXJTaGltKCl9O2UucHVzaCh0aGlzLm9uKHgsdCkpfSxfYWRkU2hpbVJlc2l6ZUhhbmRsZXJzOmZ1bmN0aW9uKCl7dGhpcy5fc3RhY2tIYW5kbGVzW1NdPXRoaXMuX3N0YWNrSGFuZGxlc1tTXXx8W107dmFyIGU9dGhpcy5zaXplU2hpbSx0PXRoaXMuX3N0YWNrSGFuZGxlc1tTXTt0LnB1c2godGhpcy5hZnRlcih4LGUpKSx0LnB1c2godGhpcy5hZnRlcihULGUpKSx0LnB1c2godGhpcy5hZnRlcihOLGUpKSx0LnB1c2godGhpcy5hZnRlcihMLGUpKX0sX2RldGFjaFN0YWNrSGFuZGxlczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9zdGFja0hhbmRsZXNbZV0sbjtpZih0JiZ0Lmxlbmd0aD4wKXdoaWxlKG49dC5wb3AoKSluLmRldGFjaCgpfSxfcmVuZGVyU2hpbTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3NoaW1Ob2RlLHQ9dGhpcy5fc3RhY2tOb2RlO2V8fChlPXRoaXMuX3NoaW1Ob2RlPXRoaXMuX2dldFNoaW1UZW1wbGF0ZSgpLHQuaW5zZXJ0QmVmb3JlKGUsdC5nZXQobSkpLHRoaXMuX2RldGFjaFN0YWNrSGFuZGxlcyhFKSx0aGlzLnNpemVTaGltKCkpfSxfZGVzdHJveVNoaW06ZnVuY3Rpb24oKXt0aGlzLl9zaGltTm9kZSYmKHRoaXMuX3NoaW1Ob2RlLmdldCh2KS5yZW1vdmVDaGlsZCh0aGlzLl9zaGltTm9kZSksdGhpcy5fc2hpbU5vZGU9bnVsbCx0aGlzLl9kZXRhY2hTdGFja0hhbmRsZXMoRSksdGhpcy5fZGV0YWNoU3RhY2tIYW5kbGVzKFMpKX0sc2l6ZVNoaW06ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9zaGltTm9kZSx0PXRoaXMuX3N0YWNrTm9kZTtlJiZyLmllPT09NiYmdGhpcy5nZXQoYSkmJihlLnNldFN0eWxlKHksdC5nZXQocCkrdyksZS5zZXRTdHlsZShiLHQuZ2V0KGQpK3cpKX0sX2dldFNoaW1UZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiBpLmNyZWF0ZShPLlNISU1fVEVNUExBVEUsdGhpcy5fc3RhY2tOb2RlLmdldChnKSl9fSxlLldpZGdldFN0YWNrPU99LCIzLjE3LjIiLHtyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJ3aWRnZXQiXSxza2lubmFibGU6ITB9KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIndpZGdldC1wb3NpdGlvbi1jb25zdHJhaW4iLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbShlKXt9dmFyIG49ImNvbnN0cmFpbiIscj0iY29uc3RyYWlufHh5Q2hhbmdlIixpPSJjb25zdHJhaW5DaGFuZ2UiLHM9InByZXZlbnRPdmVybGFwIixvPSJhbGlnbiIsdT0iIixhPSJiaW5kVUkiLGY9Inh5IixsPSJ4IixjPSJ5IixoPWUuTm9kZSxwPSJ2aWV3cG9ydFJlZ2lvbiIsZD0icmVnaW9uIix2O20uQVRUUlM9e2NvbnN0cmFpbjp7dmFsdWU6bnVsbCxzZXR0ZXI6Il9zZXRDb25zdHJhaW4ifSxwcmV2ZW50T3ZlcmxhcDp7dmFsdWU6ITF9fSx2PW0uX1BSRVZFTlRfT1ZFUkxBUD17eDp7dGx0cjoxLGJsYnI6MSxicmJsOjEsdHJ0bDoxfSx5Ont0cmJyOjEsdGxibDoxLGJsdGw6MSxicnRyOjF9fSxtLnByb3RvdHlwZT17aW5pdGlhbGl6ZXI6ZnVuY3Rpb24oKXt0aGlzLl9wb3NOb2RlfHxlLmVycm9yKCJXaWRnZXRQb3NpdGlvbiBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgV2lkZ2V0LCBiZWZvcmUgV2lkZ2V0UG9zaXRpb25Db25zdHJhaW4gaXMgYWRkZWQiKSxlLmFmdGVyKHRoaXMuX2JpbmRVSVBvc0NvbnN0cmFpbmVkLHRoaXMsYSl9LGdldENvbnN0cmFpbmVkWFk6ZnVuY3Rpb24oZSx0KXt0PXR8fHRoaXMuZ2V0KG4pO3ZhciByPXRoaXMuX2dldFJlZ2lvbih0PT09ITA/bnVsbDp0KSxpPXRoaXMuX3Bvc05vZGUuZ2V0KGQpO3JldHVyblt0aGlzLl9jb25zdHJhaW4oZVswXSxsLGksciksdGhpcy5fY29uc3RyYWluKGVbMV0sYyxpLHIpXX0sY29uc3RyYWluOmZ1bmN0aW9uKGUsdCl7dmFyIHIsaSxzPXR8fHRoaXMuZ2V0KG4pO3MmJihyPWV8fHRoaXMuZ2V0KGYpLGk9dGhpcy5nZXRDb25zdHJhaW5lZFhZKHIscyksKGlbMF0hPT1yWzBdfHxpWzFdIT09clsxXSkmJnRoaXMuc2V0KGYsaSx7Y29uc3RyYWluZWQ6ITB9KSl9LF9zZXRDb25zdHJhaW46ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0hMD9lOmgub25lKGUpfSxfY29uc3RyYWluOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKHIpe3RoaXMuZ2V0KHMpJiYoZT10aGlzLl9wcmV2ZW50T3ZlcmxhcChlLHQsbixyKSk7dmFyIGk9dD09bCxvPWk/ci53aWR0aDpyLmhlaWdodCx1PWk/bi53aWR0aDpuLmhlaWdodCxhPWk/ci5sZWZ0OnIudG9wLGY9aT9yLnJpZ2h0LXU6ci5ib3R0b20tdTtpZihlPGF8fGU+Zil1PG8/ZTxhP2U9YTplPmYmJihlPWYpOmU9YX1yZXR1cm4gZX0sX3ByZXZlbnRPdmVybGFwOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuZ2V0KG8pLHM9dD09PWwsYSxmLGMsaCxwLGQ7cmV0dXJuIGkmJmkucG9pbnRzJiZ2W3RdW2kucG9pbnRzLmpvaW4odSldJiYoZj10aGlzLl9nZXRSZWdpb24oaS5ub2RlKSxmJiYoYT1zP24ud2lkdGg6bi5oZWlnaHQsYz1zP2YubGVmdDpmLnRvcCxoPXM/Zi5yaWdodDpmLmJvdHRvbSxwPXM/Zi5sZWZ0LXIubGVmdDpmLnRvcC1yLnRvcCxkPXM/ci5yaWdodC1mLnJpZ2h0OnIuYm90dG9tLWYuYm90dG9tKSxlPmM/ZDxhJiZwPmEmJihlPWMtYSk6cDxhJiZkPmEmJihlPWgpKSxlfSxfYmluZFVJUG9zQ29uc3RyYWluZWQ6ZnVuY3Rpb24oKXt0aGlzLmFmdGVyKGksdGhpcy5fYWZ0ZXJDb25zdHJhaW5DaGFuZ2UpLHRoaXMuX2VuYWJsZUNvbnN0cmFpbnRzKHRoaXMuZ2V0KG4pKX0sX2FmdGVyQ29uc3RyYWluQ2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMuX2VuYWJsZUNvbnN0cmFpbnRzKGUubmV3VmFsKX0sX2VuYWJsZUNvbnN0cmFpbnRzOmZ1bmN0aW9uKGUpe2U/KHRoaXMuY29uc3RyYWluKCksdGhpcy5fY3h5SGFuZGxlPXRoaXMuX2N4eUhhbmRsZXx8dGhpcy5vbihyLHRoaXMuX2NvbnN0cmFpbk9uWFlDaGFuZ2UpKTp0aGlzLl9jeHlIYW5kbGUmJih0aGlzLl9jeHlIYW5kbGUuZGV0YWNoKCksdGhpcy5fY3h5SGFuZGxlPW51bGwpfSxfY29uc3RyYWluT25YWUNoYW5nZTpmdW5jdGlvbihlKXtlLmNvbnN0cmFpbmVkfHwoZS5uZXdWYWw9dGhpcy5nZXRDb25zdHJhaW5lZFhZKGUubmV3VmFsKSl9LF9nZXRSZWdpb246ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGU/KGU9aC5vbmUoZSksZSYmKHQ9ZS5nZXQoZCkpKTp0PXRoaXMuX3Bvc05vZGUuZ2V0KHApLHR9fSxlLldpZGdldFBvc2l0aW9uQ29uc3RyYWluPW19LCIzLjE3LjIiLHtyZXF1aXJlczpbIndpZGdldC1wb3NpdGlvbiJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJvdmVybGF5IixmdW5jdGlvbihlLHQpe2UuT3ZlcmxheT1lLkJhc2UuY3JlYXRlKCJvdmVybGF5IixlLldpZGdldCxbZS5XaWRnZXRTdGRNb2QsZS5XaWRnZXRQb3NpdGlvbixlLldpZGdldFN0YWNrLGUuV2lkZ2V0UG9zaXRpb25BbGlnbixlLldpZGdldFBvc2l0aW9uQ29uc3RyYWluXSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbIndpZGdldCIsIndpZGdldC1zdGRtb2QiLCJ3aWRnZXQtcG9zaXRpb24iLCJ3aWRnZXQtcG9zaXRpb24tYWxpZ24iLCJ3aWRnZXQtc3RhY2siLCJ3aWRnZXQtcG9zaXRpb24tY29uc3RyYWluIl0sc2tpbm5hYmxlOiEwfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtYXV0b2hpZGUiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbSh0KXtlLmFmdGVyKHRoaXMuX2JpbmRVSUF1dG9oaWRlLHRoaXMsZiksZS5hZnRlcih0aGlzLl9zeW5jVUlBdXRvaGlkZSx0aGlzLGwpLHRoaXMuZ2V0KGMpJiYodGhpcy5fYmluZFVJQXV0b2hpZGUoKSx0aGlzLl9zeW5jVUlBdXRvaGlkZSgpKX12YXIgbj0id2lkZ2V0QXV0b2hpZGUiLHI9ImF1dG9oaWRlIixpPSJjbGlja291dHNpZGUiLHM9ImZvY3Vzb3V0c2lkZSIsbz0iZG9jdW1lbnQiLHU9ImtleSIsYT0iZXNjIixmPSJiaW5kVUkiLGw9InN5bmNVSSIsYz0icmVuZGVyZWQiLGg9ImJvdW5kaW5nQm94IixwPSJ2aXNpYmxlIixkPSJDaGFuZ2UiLHY9ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZTttLkFUVFJTPXtoaWRlT246e3ZhbGlkYXRvcjplLkxhbmcuaXNBcnJheSx2YWx1ZUZuOmZ1bmN0aW9uKCl7cmV0dXJuW3tub2RlOmUub25lKG8pLGV2ZW50TmFtZTp1LGtleUNvZGU6YX1dfX19LG0ucHJvdG90eXBlPXtfdWlIYW5kbGVzQXV0b2hpZGU6bnVsbCxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fZGV0YWNoVUlIYW5kbGVzQXV0b2hpZGUoKX0sX2JpbmRVSUF1dG9oaWRlOmZ1bmN0aW9uKCl7dGhpcy5hZnRlcihwK2QsdGhpcy5fYWZ0ZXJIb3N0VmlzaWJsZUNoYW5nZUF1dG9oaWRlKSx0aGlzLmFmdGVyKCJoaWRlT25DaGFuZ2UiLHRoaXMuX2FmdGVySGlkZU9uQ2hhbmdlKX0sX3N5bmNVSUF1dG9oaWRlOmZ1bmN0aW9uKCl7dGhpcy5fdWlTZXRIb3N0VmlzaWJsZUF1dG9oaWRlKHRoaXMuZ2V0KHApKX0sX3VpU2V0SG9zdFZpc2libGVBdXRvaGlkZTpmdW5jdGlvbih0KXt0P2UubGF0ZXIoMSx0aGlzLCJfYXR0YWNoVUlIYW5kbGVzQXV0b2hpZGUiKTp0aGlzLl9kZXRhY2hVSUhhbmRsZXNBdXRvaGlkZSgpfSxfYXR0YWNoVUlIYW5kbGVzQXV0b2hpZGU6ZnVuY3Rpb24oKXtpZih0aGlzLl91aUhhbmRsZXNBdXRvaGlkZSlyZXR1cm47dmFyIHQ9dGhpcy5nZXQoaCksbj1lLmJpbmQodGhpcy5oaWRlLHRoaXMpLHI9W10saT10aGlzLHM9dGhpcy5nZXQoImhpZGVPbiIpLG89MCx1PXtub2RlOnVuZGVmaW5lZCxldjp1bmRlZmluZWQsa2V5Q29kZTp1bmRlZmluZWR9O2Zvcig7bzxzLmxlbmd0aDtvKyspdS5ub2RlPXNbb10ubm9kZSx1LmV2PXNbb10uZXZlbnROYW1lLHUua2V5Q29kZT1zW29dLmtleUNvZGUsIXUubm9kZSYmIXUua2V5Q29kZSYmdS5ldj9yLnB1c2godC5vbih1LmV2LG4pKTp1Lm5vZGUmJiF1LmtleUNvZGUmJnUuZXY/ci5wdXNoKHUubm9kZS5vbih1LmV2LG4pKTp1Lm5vZGUmJnUua2V5Q29kZSYmdS5ldiYmci5wdXNoKHUubm9kZS5vbih1LmV2LG4sdS5rZXlDb2RlKSk7dGhpcy5fdWlIYW5kbGVzQXV0b2hpZGU9cn0sX2RldGFjaFVJSGFuZGxlc0F1dG9oaWRlOmZ1bmN0aW9uKCl7ZS5lYWNoKHRoaXMuX3VpSGFuZGxlc0F1dG9oaWRlLGZ1bmN0aW9uKGUpe2UuZGV0YWNoKCl9KSx0aGlzLl91aUhhbmRsZXNBdXRvaGlkZT1udWxsfSxfYWZ0ZXJIb3N0VmlzaWJsZUNoYW5nZUF1dG9oaWRlOmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0SG9zdFZpc2libGVBdXRvaGlkZShlLm5ld1ZhbCl9LF9hZnRlckhpZGVPbkNoYW5nZTpmdW5jdGlvbihlKXt0aGlzLl9kZXRhY2hVSUhhbmRsZXNBdXRvaGlkZSgpLHRoaXMuZ2V0KHApJiZ0aGlzLl9hdHRhY2hVSUhhbmRsZXNBdXRvaGlkZSgpfX0sZS5XaWRnZXRBdXRvaGlkZT1tfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwiZXZlbnQta2V5IiwiZXZlbnQtb3V0c2lkZSIsIndpZGdldCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJidXR0b24tY29yZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBpKGUpe3RoaXMuaW5pdGlhbGl6ZXIoZSl9dmFyIG49ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZSxyPWUuQXR0cmlidXRlQ29yZTtpLnByb3RvdHlwZT17VEVNUExBVEU6IjxidXR0b24vPiIsY29uc3RydWN0b3I6aSxpbml0aWFsaXplcjpmdW5jdGlvbihlKXt0aGlzLl9pbml0Tm9kZShlKSx0aGlzLl9pbml0QXR0cmlidXRlcyhlKSx0aGlzLl9yZW5kZXJVSShlKX0sX2luaXROb2RlOmZ1bmN0aW9uKHQpe3QuaG9zdD90aGlzLl9ob3N0PWUub25lKHQuaG9zdCk6dGhpcy5faG9zdD1lLk5vZGUuY3JlYXRlKHRoaXMuVEVNUExBVEUpfSxfaW5pdEF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSl7ci5jYWxsKHRoaXMsaS5BVFRSUyxlKX0sX3JlbmRlclVJOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXROb2RlKCksdD1lLmdldCgibm9kZU5hbWUiKS50b0xvd2VyQ2FzZSgpO2UuYWRkQ2xhc3MoaS5DTEFTU19OQU1FUy5CVVRUT04pLHQhPT0iYnV0dG9uIiYmdCE9PSJpbnB1dCImJmUuc2V0KCJyb2xlIiwiYnV0dG9uIil9LGVuYWJsZTpmdW5jdGlvbigpe3RoaXMuc2V0KCJkaXNhYmxlZCIsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5zZXQoImRpc2FibGVkIiwhMCl9LGdldE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faG9zdHx8KHRoaXMuX2hvc3Q9dGhpcy5nZXQoImJvdW5kaW5nQm94IikpLHRoaXMuX2hvc3R9LF9nZXRMYWJlbDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Tm9kZSgpLHQ9aS5fZ2V0VGV4dExhYmVsRnJvbU5vZGUoZSk7cmV0dXJuIHR9LF9nZXRMYWJlbEhUTUw6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE5vZGUoKSx0PWkuX2dldEhUTUxGcm9tTm9kZShlKTtyZXR1cm4gdH0sX3NldExhYmVsOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLkVzY2FwZS5odG1sKHQpO3JldHVybighcnx8ci5zcmMhPT0iaW50ZXJuYWwiKSYmdGhpcy5zZXQoImxhYmVsSFRNTCIsaSx7c3JjOiJpbnRlcm5hbCJ9KSxpfSxfc2V0TGFiZWxIVE1MOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmdldE5vZGUoKSxzPWkuX2dldExhYmVsTm9kZUZyb21QYXJlbnQociksbz1yLmdldCgibm9kZU5hbWUiKS50b0xvd2VyQ2FzZSgpO3JldHVybiBvPT09ImlucHV0Ij9zLnNldCgidmFsdWUiLGUpOnMuc2V0SFRNTChlKSwoIW58fG4uc3JjIT09ImludGVybmFsIikmJnRoaXMuc2V0KCJsYWJlbCIsZSx7c3JjOiJpbnRlcm5hbCJ9KSxlfSxfc2V0RGlzYWJsZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXROb2RlKCk7cmV0dXJuIHQuZ2V0RE9NTm9kZSgpLmRpc2FibGVkPWUsdC50b2dnbGVDbGFzcyhpLkNMQVNTX05BTUVTLkRJU0FCTEVELGUpLGV9fSxlLm1peChpLnByb3RvdHlwZSxyLnByb3RvdHlwZSksaS5BVFRSUz17bGFiZWw6e3NldHRlcjoiX3NldExhYmVsIixnZXR0ZXI6Il9nZXRMYWJlbCIsbGF6eUFkZDohMX0sbGFiZWxIVE1MOntzZXR0ZXI6Il9zZXRMYWJlbEhUTUwiLGdldHRlcjoiX2dldExhYmVsSFRNTCIsbGF6eUFkZDohMX0sZGlzYWJsZWQ6e3ZhbHVlOiExLHNldHRlcjoiX3NldERpc2FibGVkIixsYXp5QWRkOiExfX0saS5OQU1FPSJidXR0b24iLGkuQ0xBU1NfTkFNRVM9e0JVVFRPTjpuKCJidXR0b24iKSxESVNBQkxFRDpuKCJidXR0b24iLCJkaXNhYmxlZCIpLFNFTEVDVEVEOm4oImJ1dHRvbiIsInNlbGVjdGVkIiksTEFCRUw6bigiYnV0dG9uIiwibGFiZWwiKX0saS5BUklBX1NUQVRFUz17UFJFU1NFRDoiYXJpYS1wcmVzc2VkIixDSEVDS0VEOiJhcmlhLWNoZWNrZWQifSxpLkFSSUFfUk9MRVM9e0JVVFRPTjoiYnV0dG9uIixDSEVDS0JPWDoiY2hlY2tib3giLFRPR0dMRToidG9nZ2xlIn0saS5fZ2V0TGFiZWxOb2RlRnJvbVBhcmVudD1mdW5jdGlvbihlKXt2YXIgdD1lLm9uZSgiLiIraS5DTEFTU19OQU1FUy5MQUJFTCl8fGU7cmV0dXJuIHR9LGkuX2dldFRleHRMYWJlbEZyb21Ob2RlPWZ1bmN0aW9uKGUpe3ZhciB0PWkuX2dldExhYmVsTm9kZUZyb21QYXJlbnQoZSksbj10LmdldCgibm9kZU5hbWUiKS50b0xvd2VyQ2FzZSgpLHI9dC5nZXQobj09PSJpbnB1dCI/InZhbHVlIjoidGV4dCIpO3JldHVybiByfSxpLl9nZXRIVE1MRnJvbU5vZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5fZ2V0TGFiZWxOb2RlRnJvbVBhcmVudChlKSxuPXQuZ2V0SFRNTCgpO3JldHVybiBufSxpLl9nZXREaXNhYmxlZEZyb21Ob2RlPWZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgiZGlzYWJsZWQiKX0sZS5CdXR0b25Db3JlPWl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImF0dHJpYnV0ZS1jb3JlIiwiY2xhc3NuYW1lbWFuYWdlciIsIm5vZGUtYmFzZSIsImVzY2FwZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJidXR0b24tcGx1Z2luIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtuLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfWUuZXh0ZW5kKG4sZS5CdXR0b25Db3JlLHtfYWZ0ZXJOb2RlR2V0OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3IuQVRUUlMscj1uW3RdJiZuW3RdLmdldHRlciYmdGhpc1tuW3RdLmdldHRlcl07aWYocilyZXR1cm4gbmV3IGUuRG8uQWx0ZXJSZXR1cm4oImdldCAiK3Qsci5jYWxsKHRoaXMpKX0sX2FmdGVyTm9kZVNldDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3IuQVRUUlMscj1uW2VdJiZuW2VdLnNldHRlciYmdGhpc1tuW2VdLnNldHRlcl07ciYmci5jYWxsKHRoaXMsdCl9LF9pbml0Tm9kZTpmdW5jdGlvbih0KXt2YXIgbj10Lmhvc3Q7dGhpcy5faG9zdD1uLGUuRG8uYWZ0ZXIodGhpcy5fYWZ0ZXJOb2RlR2V0LG4sImdldCIsdGhpcyksZS5Eby5hZnRlcih0aGlzLl9hZnRlck5vZGVTZXQsbiwic2V0Iix0aGlzKX0sZGVzdHJveTpmdW5jdGlvbigpe319LHtBVFRSUzplLm1lcmdlKGUuQnV0dG9uQ29yZS5BVFRSUyksTkFNRToiYnV0dG9uUGx1Z2luIixOUzoiYnV0dG9uIn0pLG4uY3JlYXRlTm9kZT1mdW5jdGlvbih0LG4pe3ZhciByO3JldHVybiB0JiYhbiYmIXQubm9kZVR5cGUmJiF0LmdldERPTU5vZGUmJnR5cGVvZiB0IT0ic3RyaW5nIiYmKG49dCx0PW4uc3JjTm9kZSksbj1ufHx7fSxyPW4udGVtcGxhdGV8fGUuUGx1Z2luLkJ1dHRvbi5wcm90b3R5cGUuVEVNUExBVEUsdD10fHxuLnNyY05vZGV8fGUuRE9NLmNyZWF0ZShyKSxlLm9uZSh0KS5wbHVnKGUuUGx1Z2luLkJ1dHRvbixuKX0sZS5uYW1lc3BhY2UoIlBsdWdpbiIpLkJ1dHRvbj1ufSwiMy4xNy4yIix7cmVxdWlyZXM6WyJidXR0b24tY29yZSIsImNzc2J1dHRvbiIsIm5vZGUtcGx1Z2luaG9zdCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtYnV0dG9ucyIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBwKGUpe3JldHVybiEhZS5nZXRET01Ob2RlfWZ1bmN0aW9uIGQoKXt0aGlzLl9idXR0b25zSGFuZGxlcz17fX12YXIgbj1lLkFycmF5LHI9ZS5MYW5nLGk9ZS5PYmplY3Qscz1lLlBsdWdpbi5CdXR0b24sbz1lLldpZGdldCx1PWUuV2lkZ2V0U3RkTW9kLGE9ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZSxmPXIuaXNBcnJheSxsPXIuaXNOdW1iZXIsYz1yLmlzU3RyaW5nLGg9ci5pc1ZhbHVlO2QuQVRUUlM9e2J1dHRvbnM6e2dldHRlcjoiX2dldEJ1dHRvbnMiLHNldHRlcjoiX3NldEJ1dHRvbnMiLHZhbHVlOnt9fSxkZWZhdWx0QnV0dG9uOntyZWFkT25seTohMCx2YWx1ZTpudWxsfX0sZC5DTEFTU19OQU1FUz17YnV0dG9uOmEoImJ1dHRvbiIpLGJ1dHRvbnM6by5nZXRDbGFzc05hbWUoImJ1dHRvbnMiKSxwcmltYXJ5OmEoImJ1dHRvbiIsInByaW1hcnkiKX0sZC5IVE1MX1BBUlNFUj17YnV0dG9uczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcGFyc2VCdXR0b25zKGUpfX0sZC5OT05fQlVUVE9OX05PREVfQ0ZHPVsiYWN0aW9uIiwiY2xhc3NOYW1lcyIsImNvbnRleHQiLCJldmVudHMiLCJpc0RlZmF1bHQiLCJzZWN0aW9uIl0sZC5wcm90b3R5cGU9e0JVVFRPTlM6e30sQlVUVE9OU19URU1QTEFURToiPHNwYW4gLz4iLERFRkFVTFRfQlVUVE9OU19TRUNUSU9OOnUuRk9PVEVSLGluaXRpYWxpemVyOmZ1bmN0aW9uKCl7dGhpcy5fc3RkTW9kTm9kZXx8ZS5lcnJvcigiV2lkZ2V0U3RkTW9kIG11c3QgYmUgYWRkZWQgdG8gYSBXaWRnZXQgYmVmb3JlIFdpZGdldEJ1dHRvbnMuIiksdGhpcy5fbWFwQnV0dG9ucyh0aGlzLmdldCgiYnV0dG9ucyIpKSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5hZnRlcih7YnV0dG9uc0NoYW5nZTplLmJpbmQoIl9hZnRlckJ1dHRvbnNDaGFuZ2UiLHRoaXMpLGRlZmF1bHRCdXR0b25DaGFuZ2U6ZS5iaW5kKCJfYWZ0ZXJEZWZhdWx0QnV0dG9uQ2hhbmdlIix0aGlzKX0pLGUuYWZ0ZXIodGhpcy5fYmluZFVJQnV0dG9ucyx0aGlzLCJiaW5kVUkiKSxlLmFmdGVyKHRoaXMuX3N5bmNVSUJ1dHRvbnMsdGhpcywic3luY1VJIil9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXtpLmVhY2godGhpcy5fYnV0dG9uc0hhbmRsZXMsZnVuY3Rpb24oZSl7ZS5kZXRhY2goKX0pLGRlbGV0ZSB0aGlzLl9idXR0b25zSGFuZGxlcyxkZWxldGUgdGhpcy5fYnV0dG9uc01hcCxkZWxldGUgdGhpcy5fZGVmYXVsdEJ1dHRvbn0sYWRkQnV0dG9uOmZ1bmN0aW9uKGUsdCxyKXt2YXIgaT10aGlzLmdldCgiYnV0dG9ucyIpLHMsbztyZXR1cm4gcChlKXx8KGU9dGhpcy5fbWVyZ2VCdXR0b25Db25maWcoZSksdHx8KHQ9ZS5zZWN0aW9uKSksdHx8KHQ9dGhpcy5ERUZBVUxUX0JVVFRPTlNfU0VDVElPTikscz1pW3RdfHwoaVt0XT1bXSksbChyKXx8KHI9cy5sZW5ndGgpLHMuc3BsaWNlKHIsMCxlKSxvPW4uaW5kZXhPZihzLGUpLHRoaXMuc2V0KCJidXR0b25zIixpLHtidXR0b246ZSxzZWN0aW9uOnQsaW5kZXg6byxzcmM6ImFkZCJ9KSx0aGlzfSxnZXRCdXR0b246ZnVuY3Rpb24oZSx0KXtpZighaChlKSlyZXR1cm47dmFyIG49dGhpcy5fYnV0dG9uc01hcCxyO3JldHVybiB0fHwodD10aGlzLkRFRkFVTFRfQlVUVE9OU19TRUNUSU9OKSxsKGUpPyhyPXRoaXMuZ2V0KCJidXR0b25zIiksclt0XSYmclt0XVtlXSk6YXJndW1lbnRzLmxlbmd0aD4xP25bdCsiOiIrZV06bltlXX0scmVtb3ZlQnV0dG9uOmZ1bmN0aW9uKGUsdCl7aWYoIWgoZSkpcmV0dXJuIHRoaXM7dmFyIHI9dGhpcy5nZXQoImJ1dHRvbnMiKSxzO3JldHVybiBsKGUpPyh0fHwodD10aGlzLkRFRkFVTFRfQlVUVE9OU19TRUNUSU9OKSxzPWUsZT1yW3RdW3NdKTooYyhlKSYmKGU9dGhpcy5nZXRCdXR0b24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxpLnNvbWUocixmdW5jdGlvbihyLGkpe3M9bi5pbmRleE9mKHIsZSk7aWYocz4tMSlyZXR1cm4gdD1pLCEwfSkpLGUmJnM+LTEmJihyW3RdLnNwbGljZShzLDEpLHRoaXMuc2V0KCJidXR0b25zIixyLHtidXR0b246ZSxzZWN0aW9uOnQsaW5kZXg6cyxzcmM6InJlbW92ZSJ9KSksdGhpc30sX2JpbmRVSUJ1dHRvbnM6ZnVuY3Rpb24oKXt2YXIgdD1lLmJpbmQoIl9hZnRlckNvbnRlbnRDaGFuZ2VCdXR0b25zIix0aGlzKTt0aGlzLmFmdGVyKHt2aXNpYmxlQ2hhbmdlOmUuYmluZCgiX2FmdGVyVmlzaWJsZUNoYW5nZUJ1dHRvbnMiLHRoaXMpLGhlYWRlckNvbnRlbnRDaGFuZ2U6dCxib2R5Q29udGVudENoYW5nZTp0LGZvb3RlckNvbnRlbnRDaGFuZ2U6dH0pfSxfY3JlYXRlQnV0dG9uOmZ1bmN0aW9uKHQpe3ZhciByLGksbyx1LGEsZixsLGg7aWYocCh0KSlyZXR1cm4gZS5vbmUodC5nZXRET01Ob2RlKCkpLnBsdWcocyk7cj1lLm1lcmdlKHtjb250ZXh0OnRoaXMsZXZlbnRzOiJjbGljayIsbGFiZWw6dC52YWx1ZX0sdCksaT1lLm1lcmdlKHIpLG89ZC5OT05fQlVUVE9OX05PREVfQ0ZHO2Zvcih1PTAsYT1vLmxlbmd0aDt1PGE7dSs9MSlkZWxldGUgaVtvW3VdXTtyZXR1cm4gdD1zLmNyZWF0ZU5vZGUoaSksbD1yLmNvbnRleHQsZj1yLmFjdGlvbixjKGYpJiYoZj1lLmJpbmQoZixsKSksaD10Lm9uKHIuZXZlbnRzLGYsbCksdGhpcy5fYnV0dG9uc0hhbmRsZXNbZS5zdGFtcCh0LCEwKV09aCx0LnNldERhdGEoIm5hbWUiLHRoaXMuX2dldEJ1dHRvbk5hbWUocikpLHQuc2V0RGF0YSgiZGVmYXVsdCIsdGhpcy5fZ2V0QnV0dG9uRGVmYXVsdChyKSksbi5lYWNoKG4oci5jbGFzc05hbWVzKSx0LmFkZENsYXNzLHQpLHR9LF9nZXRCdXR0b25Db250YWluZXI6ZnVuY3Rpb24odCxuKXt2YXIgcj11LlNFQ1RJT05fQ0xBU1NfTkFNRVNbdF0saT1kLkNMQVNTX05BTUVTLmJ1dHRvbnMscz10aGlzLmdldCgiY29udGVudEJveCIpLG8sYTtyZXR1cm4gbz0iLiIrcisiIC4iK2ksYT1zLm9uZShvKSwhYSYmbiYmKGE9ZS5Ob2RlLmNyZWF0ZSh0aGlzLkJVVFRPTlNfVEVNUExBVEUpLGEuYWRkQ2xhc3MoaSkpLGF9LF9nZXRCdXR0b25EZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PXAoZSk/ZS5nZXREYXRhKCJkZWZhdWx0Iik6ZS5pc0RlZmF1bHQ7cmV0dXJuIGModCk/dC50b0xvd2VyQ2FzZSgpPT09InRydWUiOiEhdH0sX2dldEJ1dHRvbk5hbWU6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHAoZSk/dD1lLmdldERhdGEoIm5hbWUiKXx8ZS5nZXQoIm5hbWUiKTp0PWUmJihlLm5hbWV8fGUudHlwZSksdH0sX2dldEJ1dHRvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGkuZWFjaChlLGZ1bmN0aW9uKGUsbil7dFtuXT1lLmNvbmNhdCgpfSksdH0sX21hcEJ1dHRvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2J1dHRvbnNNYXAscj10aGlzLl9nZXRCdXR0b25OYW1lKGUpLGk9dGhpcy5fZ2V0QnV0dG9uRGVmYXVsdChlKTtyJiYobltyXT1lLG5bdCsiOiIrcl09ZSksaSYmKHRoaXMuX2RlZmF1bHRCdXR0b249ZSl9LF9tYXBCdXR0b25zOmZ1bmN0aW9uKGUpe3RoaXMuX2J1dHRvbnNNYXA9e30sdGhpcy5fZGVmYXVsdEJ1dHRvbj1udWxsLGkuZWFjaChlLGZ1bmN0aW9uKGUsdCl7dmFyIG4scjtmb3Iobj0wLHI9ZS5sZW5ndGg7bjxyO24rPTEpdGhpcy5fbWFwQnV0dG9uKGVbbl0sdCl9LHRoaXMpfSxfbWVyZ2VCdXR0b25Db25maWc6ZnVuY3Rpb24odCl7dmFyIG4scixpLHMsbyx1O3JldHVybiB0PWModCk/e25hbWU6dH06ZS5tZXJnZSh0KSx0LnNyY05vZGUmJihzPXQuc3JjTm9kZSxvPXMuZ2V0KCJ0YWdOYW1lIikudG9Mb3dlckNhc2UoKSx1PXMuZ2V0KG89PT0iaW5wdXQiPyJ2YWx1ZSI6InRleHQiKSxuPXtkaXNhYmxlZDohIXMuZ2V0KCJkaXNhYmxlZCIpLGlzRGVmYXVsdDp0aGlzLl9nZXRCdXR0b25EZWZhdWx0KHMpLG5hbWU6dGhpcy5fZ2V0QnV0dG9uTmFtZShzKX0sdSYmKG4ubGFiZWw9dSksZS5taXgodCxuLCExLG51bGwsMCwhMCkpLGk9dGhpcy5fZ2V0QnV0dG9uTmFtZSh0KSxyPXRoaXMuQlVUVE9OUyYmdGhpcy5CVVRUT05TW2ldLHImJmUubWl4KHQsciwhMSxudWxsLDAsITApLHR9LF9wYXJzZUJ1dHRvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9Ii4iK2QuQ0xBU1NfTkFNRVMuYnV0dG9uLHI9WyJoZWFkZXIiLCJib2R5IiwiZm9vdGVyIl0saT1udWxsO3JldHVybiBuLmVhY2gocixmdW5jdGlvbihlKXt2YXIgbj10aGlzLl9nZXRCdXR0b25Db250YWluZXIoZSkscj1uJiZuLmFsbCh0KSxzO2lmKCFyfHxyLmlzRW1wdHkoKSlyZXR1cm47cz1bXSxyLmVhY2goZnVuY3Rpb24oZSl7cy5wdXNoKHtzcmNOb2RlOmV9KX0pLGl8fChpPXt9KSxpW2VdPXN9LHRoaXMpLGl9LF9zZXRCdXR0b25zOmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoZSxyKXtpZighZihlKSlyZXR1cm47dmFyIGkscyxvLHU7Zm9yKGk9MCxzPWUubGVuZ3RoO2k8cztpKz0xKW89ZVtpXSx1PXIscChvKXx8KG89dGhpcy5fbWVyZ2VCdXR0b25Db25maWcobyksdXx8KHU9by5zZWN0aW9uKSksbz10aGlzLl9jcmVhdGVCdXR0b24obyksdXx8KHU9dCksKG5bdV18fChuW3VdPVtdKSkucHVzaChvKX12YXIgdD10aGlzLkRFRkFVTFRfQlVUVE9OU19TRUNUSU9OLG49e307cmV0dXJuIGYoZSk/ci5jYWxsKHRoaXMsZSk6aS5lYWNoKGUscix0aGlzKSxufSxfc3luY1VJQnV0dG9uczpmdW5jdGlvbigpe3RoaXMuX3VpU2V0QnV0dG9ucyh0aGlzLmdldCgiYnV0dG9ucyIpKSx0aGlzLl91aVNldERlZmF1bHRCdXR0b24odGhpcy5nZXQoImRlZmF1bHRCdXR0b24iKSksdGhpcy5fdWlTZXRWaXNpYmxlQnV0dG9ucyh0aGlzLmdldCgidmlzaWJsZSIpKX0sX3VpSW5zZXJ0QnV0dG9uOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1kLkNMQVNTX05BTUVTLmJ1dHRvbixpPXRoaXMuX2dldEJ1dHRvbkNvbnRhaW5lcih0LCEwKSxzPWkuYWxsKCIuIityKTtpLmluc2VydEJlZm9yZShlLHMuaXRlbShuKSksdGhpcy5zZXRTdGRNb2RDb250ZW50KHQsaSwiYWZ0ZXIiKX0sX3VpUmVtb3ZlQnV0dG9uOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLnN0YW1wKHQsdGhpcykscz10aGlzLl9idXR0b25zSGFuZGxlcyxvPXNbaV0sdSxhO28mJm8uZGV0YWNoKCksZGVsZXRlIHNbaV0sdC5yZW1vdmUoKSxyfHwocj17fSksci5wcmVzZXJ2ZUNvbnRlbnR8fCh1PXRoaXMuX2dldEJ1dHRvbkNvbnRhaW5lcihuKSxhPWQuQ0xBU1NfTkFNRVMuYnV0dG9uLHUmJnUuYWxsKCIuIithKS5pc0VtcHR5KCkmJih1LnJlbW92ZSgpLHRoaXMuX3VwZGF0ZUNvbnRlbnRCdXR0b25zKG4pKSl9LF91aVNldEJ1dHRvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZC5DTEFTU19OQU1FUy5idXR0b24scj1bImhlYWRlciIsImJvZHkiLCJmb290ZXIiXTtuLmVhY2gocixmdW5jdGlvbihuKXt2YXIgcj1lW25dfHxbXSxpPXIubGVuZ3RoLHM9dGhpcy5fZ2V0QnV0dG9uQ29udGFpbmVyKG4saSksbz0hMSx1LGEsZixsO2lmKCFzKXJldHVybjt1PXMuYWxsKCIuIit0KTtmb3IoYT0wO2E8aTthKz0xKWY9clthXSxsPXUuaW5kZXhPZihmKSxsPi0xPyh1LnNwbGljZShsLDEpLGwhPT1hJiYocy5pbnNlcnRCZWZvcmUoZixhKzEpLG89ITApKToocy5hcHBlbmRDaGlsZChmKSxvPSEwKTt1LmVhY2goZnVuY3Rpb24oZSl7dGhpcy5fdWlSZW1vdmVCdXR0b24oZSxuLHtwcmVzZXJ2ZUNvbnRlbnQ6ITB9KSxvPSEwfSx0aGlzKTtpZihpPT09MCl7cy5yZW1vdmUoKSx0aGlzLl91cGRhdGVDb250ZW50QnV0dG9ucyhuKTtyZXR1cm59byYmdGhpcy5zZXRTdGRNb2RDb250ZW50KG4scywiYWZ0ZXIiKX0sdGhpcyl9LF91aVNldERlZmF1bHRCdXR0b246ZnVuY3Rpb24oZSx0KXt2YXIgbj1kLkNMQVNTX05BTUVTLnByaW1hcnk7ZSYmZS5hZGRDbGFzcyhuKSx0JiZ0LnJlbW92ZUNsYXNzKG4pfSxfdWlTZXRWaXNpYmxlQnV0dG9uczpmdW5jdGlvbihlKXtpZighZSlyZXR1cm47dmFyIHQ9dGhpcy5nZXQoImRlZmF1bHRCdXR0b24iKTt0JiZ0LmZvY3VzKCl9LF91bk1hcEJ1dHRvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2J1dHRvbnNNYXAscj10aGlzLl9nZXRCdXR0b25OYW1lKGUpLGk7ciYmKG5bcl09PT1lJiZkZWxldGUgCm5bcl0saT10KyI6IityLG5baV09PT1lJiZkZWxldGUgbltpXSksdGhpcy5fZGVmYXVsdEJ1dHRvbj09PWUmJih0aGlzLl9kZWZhdWx0QnV0dG9uPW51bGwpfSxfdXBkYXRlRGVmYXVsdEJ1dHRvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2RlZmF1bHRCdXR0b247dGhpcy5nZXQoImRlZmF1bHRCdXR0b24iKSE9PWUmJnRoaXMuX3NldCgiZGVmYXVsdEJ1dHRvbiIsZSl9LF91cGRhdGVDb250ZW50QnV0dG9uczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFN0ZE1vZE5vZGUoZSkuZ2V0KCJjaGlsZE5vZGVzIik7dGhpcy5zZXQoZSsiQ29udGVudCIsdC5pc0VtcHR5KCk/bnVsbDp0LHtzcmM6ImJ1dHRvbnMifSl9LF9hZnRlckJ1dHRvbnNDaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5uZXdWYWwsbj1lLnNlY3Rpb24scj1lLmluZGV4LGk9ZS5zcmMscztpZihpPT09ImFkZCIpe3M9dFtuXVtyXSx0aGlzLl9tYXBCdXR0b24ocyxuKSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5fdWlJbnNlcnRCdXR0b24ocyxuLHIpO3JldHVybn1pZihpPT09InJlbW92ZSIpe3M9ZS5idXR0b24sdGhpcy5fdW5NYXBCdXR0b24ocyxuKSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5fdWlSZW1vdmVCdXR0b24ocyxuKTtyZXR1cm59dGhpcy5fbWFwQnV0dG9ucyh0KSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5fdWlTZXRCdXR0b25zKHQpfSxfYWZ0ZXJDb250ZW50Q2hhbmdlQnV0dG9uczpmdW5jdGlvbihlKXt2YXIgdD1lLnNyYyxuPWUuc3RkTW9kUG9zaXRpb24scj0hbnx8bj09PXUuUkVQTEFDRTtyJiZ0IT09ImJ1dHRvbnMiJiZ0IT09by5VSV9TUkMmJnRoaXMuX3VpU2V0QnV0dG9ucyh0aGlzLmdldCgiYnV0dG9ucyIpKX0sX2FmdGVyRGVmYXVsdEJ1dHRvbkNoYW5nZTpmdW5jdGlvbihlKXt0aGlzLl91aVNldERlZmF1bHRCdXR0b24oZS5uZXdWYWwsZS5wcmV2VmFsKX0sX2FmdGVyVmlzaWJsZUNoYW5nZUJ1dHRvbnM6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRWaXNpYmxlQnV0dG9ucyhlLm5ld1ZhbCl9fSxlLldpZGdldEJ1dHRvbnM9ZH0sIjMuMTcuMiIse3JlcXVpcmVzOlsiYnV0dG9uLXBsdWdpbiIsImNzc2J1dHRvbiIsIndpZGdldC1zdGRtb2QiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgid2lkZ2V0LW1vZGFsaXR5IixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGcoZSl7fXZhciBuPSJ3aWRnZXQiLHI9InJlbmRlclVJIixpPSJiaW5kVUkiLHM9InN5bmNVSSIsbz0iYm91bmRpbmdCb3giLHU9InZpc2libGUiLGE9InpJbmRleCIsZj0iQ2hhbmdlIixsPWUuTGFuZy5pc0Jvb2xlYW4sYz1lLkNsYXNzTmFtZU1hbmFnZXIuZ2V0Q2xhc3NOYW1lLGg9Im1hc2tTaG93IixwPSJtYXNrSGlkZSIsZD0iY2xpY2tvdXRzaWRlIix2PSJmb2N1c291dHNpZGUiLG09ZnVuY3Rpb24oKXsKLyohIElTX1BPU0lUSU9OX0ZJWEVEX1NVUFBPUlRFRCAtIEp1cml5IFpheXRzZXYgKGthbmdheCkgLSBodHRwOi8veXVyYS50aGlua3dlYjIuY29tL2NmdC8gKi8KO3ZhciB0PWUuY29uZmlnLmRvYyxuPW51bGwscixpO3JldHVybiB0LmNyZWF0ZUVsZW1lbnQmJihyPXQuY3JlYXRlRWxlbWVudCgiZGl2IiksciYmci5zdHlsZSYmKHIuc3R5bGUucG9zaXRpb249ImZpeGVkIixyLnN0eWxlLnRvcD0iMTBweCIsaT10LmJvZHksaSYmaS5hcHBlbmRDaGlsZCYmaS5yZW1vdmVDaGlsZCYmKGkuYXBwZW5kQ2hpbGQociksbj1yLm9mZnNldFRvcD09PTEwLGkucmVtb3ZlQ2hpbGQocikpKSksbn0oKSx5PSJtb2RhbCIsYj0ibWFzayIsdz17bW9kYWw6YyhuLHkpLG1hc2s6YyhuLGIpfTtnLkFUVFJTPXttYXNrTm9kZTp7Z2V0dGVyOiJfZ2V0TWFza05vZGUiLHJlYWRPbmx5OiEwfSxtb2RhbDp7dmFsdWU6ITEsdmFsaWRhdG9yOmx9LGZvY3VzT246e3ZhbHVlRm46ZnVuY3Rpb24oKXtyZXR1cm5be2V2ZW50TmFtZTpkfSx7ZXZlbnROYW1lOnZ9XX0sdmFsaWRhdG9yOmUuTGFuZy5pc0FycmF5fX0sZy5DTEFTU0VTPXcsZy5fTUFTSz1udWxsLGcuX0dFVF9NQVNLPWZ1bmN0aW9uKCl7dmFyIHQ9Zy5fTUFTSyxuPWUub25lKCJ3aW4iKTtyZXR1cm4gdCYmdC5nZXRET01Ob2RlKCkhPT1udWxsJiZ0LmluRG9jKCk/dDoodD1lLk5vZGUuY3JlYXRlKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKHcubWFzayksZy5fTUFTSz10LG0/dC5zZXRTdHlsZXMoe3Bvc2l0aW9uOiJmaXhlZCIsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsdG9wOiIwIixsZWZ0OiIwIixkaXNwbGF5OiJibG9jayJ9KTp0LnNldFN0eWxlcyh7cG9zaXRpb246ImFic29sdXRlIix3aWR0aDpuLmdldCgid2luV2lkdGgiKSsicHgiLGhlaWdodDpuLmdldCgid2luSGVpZ2h0IikrInB4Iix0b3A6IjAiLGxlZnQ6IjAiLGRpc3BsYXk6ImJsb2NrIn0pLHQpfSxnLlNUQUNLPVtdLGcucHJvdG90eXBlPXtpbml0aWFsaXplcjpmdW5jdGlvbigpe2UuYWZ0ZXIodGhpcy5fcmVuZGVyVUlNb2RhbCx0aGlzLHIpLGUuYWZ0ZXIodGhpcy5fc3luY1VJTW9kYWwsdGhpcyxzKSxlLmFmdGVyKHRoaXMuX2JpbmRVSU1vZGFsLHRoaXMsaSl9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl91aVNldEhvc3RWaXNpYmxlTW9kYWwoITEpfSxfdWlIYW5kbGVzTW9kYWw6bnVsbCxfcmVuZGVyVUlNb2RhbDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KG8pO3RoaXMuX3JlcG9zaXRpb25NYXNrKHRoaXMpLGUuYWRkQ2xhc3Mody5tb2RhbCl9LF9iaW5kVUlNb2RhbDpmdW5jdGlvbigpe3RoaXMuYWZ0ZXIodStmLHRoaXMuX2FmdGVySG9zdFZpc2libGVDaGFuZ2VNb2RhbCksdGhpcy5hZnRlcihhK2YsdGhpcy5fYWZ0ZXJIb3N0WkluZGV4Q2hhbmdlTW9kYWwpLHRoaXMuYWZ0ZXIoImZvY3VzT25DaGFuZ2UiLHRoaXMuX2FmdGVyRm9jdXNPbkNoYW5nZSksKCFtfHxlLlVBLmlvcyYmZS5VQS5pb3M8NXx8ZS5VQS5hbmRyb2lkJiZlLlVBLmFuZHJvaWQ8MykmJmUub25lKCJ3aW4iKS5vbigic2Nyb2xsIix0aGlzLl9yZXN5bmNNYXNrLHRoaXMpfSxfc3luY1VJTW9kYWw6ZnVuY3Rpb24oKXt0aGlzLl91aVNldEhvc3RWaXNpYmxlTW9kYWwodGhpcy5nZXQodSkpfSxfZm9jdXM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldChvKSx0PWUuZ2V0KCJ0YWJJbmRleCIpO2Uuc2V0KCJ0YWJJbmRleCIsdD49MD90OjApLHRoaXMuZm9jdXMoKX0sX2JsdXI6ZnVuY3Rpb24oKXt0aGlzLmJsdXIoKX0sX2dldE1hc2tOb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIGcuX0dFVF9NQVNLKCl9LF91aVNldEhvc3RWaXNpYmxlTW9kYWw6ZnVuY3Rpb24odCl7dmFyIG49Zy5TVEFDSyxyPXRoaXMuZ2V0KCJtYXNrTm9kZSIpLGk9dGhpcy5nZXQoIm1vZGFsIikscyxvO3Q/KGUuQXJyYXkuZWFjaChuLGZ1bmN0aW9uKGUpe2UuX2RldGFjaFVJSGFuZGxlc01vZGFsKCksZS5fYmx1cigpfSksbi51bnNoaWZ0KHRoaXMpLHRoaXMuX3JlcG9zaXRpb25NYXNrKHRoaXMpLHRoaXMuX3VpU2V0SG9zdFpJbmRleE1vZGFsKHRoaXMuZ2V0KGEpKSxpJiYoci5zaG93KCksZS5sYXRlcigxLHRoaXMsIl9hdHRhY2hVSUhhbmRsZXNNb2RhbCIpLHRoaXMuX2ZvY3VzKCkpKToobz1lLkFycmF5LmluZGV4T2Yobix0aGlzKSxvPj0wJiZuLnNwbGljZShvLDEpLHRoaXMuX2RldGFjaFVJSGFuZGxlc01vZGFsKCksdGhpcy5fYmx1cigpLG4ubGVuZ3RoPyhzPW5bMF0sdGhpcy5fcmVwb3NpdGlvbk1hc2socykscy5fdWlTZXRIb3N0WkluZGV4TW9kYWwocy5nZXQoYSkpLHMuZ2V0KCJtb2RhbCIpJiYoZS5sYXRlcigxLHMsIl9hdHRhY2hVSUhhbmRsZXNNb2RhbCIpLHMuX2ZvY3VzKCkpKTpyLmdldFN0eWxlKCJkaXNwbGF5Iik9PT0iYmxvY2siJiZyLmhpZGUoKSl9LF91aVNldEhvc3RaSW5kZXhNb2RhbDpmdW5jdGlvbihlKXt0aGlzLmdldCgibW9kYWwiKSYmdGhpcy5nZXQoIm1hc2tOb2RlIikuc2V0U3R5bGUoYSxlfHwwKX0sX2F0dGFjaFVJSGFuZGxlc01vZGFsOmZ1bmN0aW9uKCl7aWYodGhpcy5fdWlIYW5kbGVzTW9kYWx8fGcuU1RBQ0tbMF0hPT10aGlzKXJldHVybjt2YXIgdD10aGlzLmdldChvKSxuPXRoaXMuZ2V0KCJtYXNrTm9kZSIpLHI9dGhpcy5nZXQoImZvY3VzT24iKSxpPWUuYmluZCh0aGlzLl9mb2N1cyx0aGlzKSxzPVtdLHUsYSxmO2Zvcih1PTAsYT1yLmxlbmd0aDt1PGE7dSsrKWY9e30sZi5ub2RlPXJbdV0ubm9kZSxmLmV2PXJbdV0uZXZlbnROYW1lLGYua2V5Q29kZT1yW3VdLmtleUNvZGUsIWYubm9kZSYmIWYua2V5Q29kZSYmZi5ldj9zLnB1c2godC5vbihmLmV2LGkpKTpmLm5vZGUmJiFmLmtleUNvZGUmJmYuZXY/cy5wdXNoKGYubm9kZS5vbihmLmV2LGkpKTpmLm5vZGUmJmYua2V5Q29kZSYmZi5ldj9zLnB1c2goZi5ub2RlLm9uKGYuZXYsaSxmLmtleUNvZGUpKTplLkxvZygnZm9jdXNPbiBBVFRSIEVycm9yOiBUaGUgZXZlbnQgd2l0aCBuYW1lICInK2YuZXYrJyIgY291bGQgbm90IGJlIGF0dGFjaGVkLicpO218fHMucHVzaChlLm9uZSgid2luIikub24oInNjcm9sbCIsZS5iaW5kKGZ1bmN0aW9uKCl7bi5zZXRTdHlsZSgidG9wIixuLmdldCgiZG9jU2Nyb2xsWSIpKX0sdGhpcykpKSx0aGlzLl91aUhhbmRsZXNNb2RhbD1zfSxfZGV0YWNoVUlIYW5kbGVzTW9kYWw6ZnVuY3Rpb24oKXtlLmVhY2godGhpcy5fdWlIYW5kbGVzTW9kYWwsZnVuY3Rpb24oZSl7ZS5kZXRhY2goKX0pLHRoaXMuX3VpSGFuZGxlc01vZGFsPW51bGx9LF9hZnRlckhvc3RWaXNpYmxlQ2hhbmdlTW9kYWw6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRIb3N0VmlzaWJsZU1vZGFsKGUubmV3VmFsKX0sX2FmdGVySG9zdFpJbmRleENoYW5nZU1vZGFsOmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0SG9zdFpJbmRleE1vZGFsKGUubmV3VmFsKX0saXNOZXN0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT1nLlNUQUNLLmxlbmd0aCx0PWU+MT8hMDohMTtyZXR1cm4gdH0sX3JlcG9zaXRpb25NYXNrOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuZ2V0KCJtb2RhbCIpLHI9dC5nZXQoIm1vZGFsIiksaT10aGlzLmdldCgibWFza05vZGUiKSxzLHU7aWYobiYmIXIpaS5yZW1vdmUoKSx0aGlzLmZpcmUocCk7ZWxzZSBpZighbiYmcnx8biYmcilpLnJlbW92ZSgpLHRoaXMuZmlyZShwKSxzPXQuZ2V0KG8pLHU9cy5nZXQoInBhcmVudE5vZGUiKXx8ZS5vbmUoImJvZHkiKSx1Lmluc2VydChpLHUuZ2V0KCJmaXJzdENoaWxkIikpLHRoaXMuZmlyZShoKX0sX3Jlc3luY01hc2s6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jdXJyZW50VGFyZ2V0LG49dC5nZXQoImRvY1Njcm9sbFgiKSxyPXQuZ2V0KCJkb2NTY3JvbGxZIiksaT10LmdldCgiaW5uZXJXaWR0aCIpfHx0LmdldCgid2luV2lkdGgiKSxzPXQuZ2V0KCJpbm5lckhlaWdodCIpfHx0LmdldCgid2luSGVpZ2h0Iiksbz10aGlzLmdldCgibWFza05vZGUiKTtvLnNldFN0eWxlcyh7dG9wOnIrInB4IixsZWZ0Om4rInB4Iix3aWR0aDppKyJweCIsaGVpZ2h0OnMrInB4In0pfSxfYWZ0ZXJGb2N1c09uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fZGV0YWNoVUlIYW5kbGVzTW9kYWwoKSx0aGlzLmdldCh1KSYmdGhpcy5fYXR0YWNoVUlIYW5kbGVzTW9kYWwoKX19LGUuV2lkZ2V0TW9kYWxpdHk9Z30sIjMuMTcuMiIse3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsImV2ZW50LW91dHNpZGUiLCJ3aWRnZXQiXSxza2lubmFibGU6ITB9KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInBhbmVsIixmdW5jdGlvbihlLHQpe3ZhciBuPWUuQ2xhc3NOYW1lTWFuYWdlci5nZXRDbGFzc05hbWU7ZS5QYW5lbD1lLkJhc2UuY3JlYXRlKCJwYW5lbCIsZS5XaWRnZXQsW2UuV2lkZ2V0UG9zaXRpb24sZS5XaWRnZXRTdGRNb2QsZS5XaWRnZXRBdXRvaGlkZSxlLldpZGdldEJ1dHRvbnMsZS5XaWRnZXRNb2RhbGl0eSxlLldpZGdldFBvc2l0aW9uQWxpZ24sZS5XaWRnZXRQb3NpdGlvbkNvbnN0cmFpbixlLldpZGdldFN0YWNrXSx7QlVUVE9OUzp7Y2xvc2U6e2xhYmVsOiJDbG9zZSIsYWN0aW9uOiJoaWRlIixzZWN0aW9uOiJoZWFkZXIiLHRlbXBsYXRlOic8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgLz4nLGNsYXNzTmFtZXM6bigiYnV0dG9uIiwiY2xvc2UiKX19fSx7QVRUUlM6e2J1dHRvbnM6e3ZhbHVlOlsiY2xvc2UiXX19fSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbIndpZGdldCIsIndpZGdldC1hdXRvaGlkZSIsIndpZGdldC1idXR0b25zIiwid2lkZ2V0LW1vZGFsaXR5Iiwid2lkZ2V0LXBvc2l0aW9uIiwid2lkZ2V0LXBvc2l0aW9uLWFsaWduIiwid2lkZ2V0LXBvc2l0aW9uLWNvbnN0cmFpbiIsIndpZGdldC1zdGFjayIsIndpZGdldC1zdGRtb2QiXSxza2lubmFibGU6ITB9KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInl1aS10aHJvdHRsZSIsZnVuY3Rpb24oZSx0KXsKLyohIEJhc2VkIG9uIHdvcmsgYnkgU2ltb24gV2lsbGlzb246IGh0dHA6Ly9naXN0LmdpdGh1Yi5jb20vMjkyNTYyICovCjtlLnRocm90dGxlPWZ1bmN0aW9uKHQsbil7bj1uP246ZS5jb25maWcudGhyb3R0bGVUaW1lfHwxNTA7aWYobj09PS0xKXJldHVybiBmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt2YXIgcj1lLkxhbmcubm93KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9ZS5MYW5nLm5vdygpO2ktcj5uJiYocj1pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkZC1kZG0tYmFzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbigpe24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O24uTkFNRT0iZGRtIixuLkFUVFJTPXtkcmFnQ3Vyc29yOnt2YWx1ZToibW92ZSJ9LGNsaWNrUGl4ZWxUaHJlc2g6e3ZhbHVlOjN9LGNsaWNrVGltZVRocmVzaDp7dmFsdWU6MWUzfSx0aHJvdHRsZVRpbWU6e3ZhbHVlOi0xfSxkcmFnTW9kZTp7dmFsdWU6InBvaW50IixzZXR0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NldERyYWdNb2RlKGUpLGV9fX0sZS5leHRlbmQobixlLkJhc2Use19jcmVhdGVQRzpmdW5jdGlvbigpe30sX2FjdGl2ZTpudWxsLF9zZXREcmFnTW9kZTpmdW5jdGlvbih0KXt0PT09bnVsbCYmKHQ9ZS5ERC5ERE0uZ2V0KCJkcmFnTW9kZSIpKTtzd2l0Y2godCl7Y2FzZSAxOmNhc2UiaW50ZXJzZWN0IjpyZXR1cm4gMTtjYXNlIDI6Y2FzZSJzdHJpY3QiOnJldHVybiAyO2Nhc2UgMDpjYXNlInBvaW50IjpyZXR1cm4gMH1yZXR1cm4gMH0sQ1NTX1BSRUZJWDplLkNsYXNzTmFtZU1hbmFnZXIuZ2V0Q2xhc3NOYW1lKCJkZCIpLF9hY3RpdmF0ZVRhcmdldHM6ZnVuY3Rpb24oKXt9LF9kcmFnczpbXSxhY3RpdmVEcmFnOiExLF9yZWdEcmFnOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldERyYWcoZS5nZXQoIm5vZGUiKSk/ITE6KHRoaXMuX2FjdGl2ZXx8dGhpcy5fc2V0dXBMaXN0ZW5lcnMoKSx0aGlzLl9kcmFncy5wdXNoKGUpLCEwKX0sX3VucmVnRHJhZzpmdW5jdGlvbih0KXt2YXIgbj1bXTtlLkFycmF5LmVhY2godGhpcy5fZHJhZ3MsZnVuY3Rpb24oZSl7ZSE9PXQmJihuW24ubGVuZ3RoXT1lKX0pLHRoaXMuX2RyYWdzPW59LF9zZXR1cExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX2NyZWF0ZVBHKCksdGhpcy5fYWN0aXZlPSEwO3ZhciB0PWUub25lKGUuY29uZmlnLmRvYyk7dC5vbigibW91c2Vtb3ZlIixlLnRocm90dGxlKGUuYmluZCh0aGlzLl9kb2NNb3ZlLHRoaXMpLHRoaXMuZ2V0KCJ0aHJvdHRsZVRpbWUiKSkpLHQub24oIm1vdXNldXAiLGUuYmluZCh0aGlzLl9lbmQsdGhpcykpfSxfc3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImRkbTpzdGFydCIpLHRoaXMuX3N0YXJ0RHJhZygpfSxfc3RhcnREcmFnOmZ1bmN0aW9uKCl7fSxfZW5kRHJhZzpmdW5jdGlvbigpe30sX2Ryb3BNb3ZlOmZ1bmN0aW9uKCl7fSxfZW5kOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmVEcmFnJiYodGhpcy5fc2hpbW1pbmc9ITEsdGhpcy5fZW5kRHJhZygpLHRoaXMuZmlyZSgiZGRtOmVuZCIpLHRoaXMuYWN0aXZlRHJhZy5lbmQuY2FsbCh0aGlzLmFjdGl2ZURyYWcpLHRoaXMuYWN0aXZlRHJhZz1udWxsKX0sc3RvcERyYWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmVEcmFnJiZ0aGlzLl9lbmQoKSx0aGlzfSxfc2hpbW1pbmc6ITEsX2RvY01vdmU6ZnVuY3Rpb24oZSl7dGhpcy5fc2hpbW1pbmd8fHRoaXMuX21vdmUoZSl9LF9tb3ZlOmZ1bmN0aW9uKGUpe3RoaXMuYWN0aXZlRHJhZyYmKHRoaXMuYWN0aXZlRHJhZy5fbW92ZS5jYWxsKHRoaXMuYWN0aXZlRHJhZyxlKSx0aGlzLl9kcm9wTW92ZSgpKX0sY3NzU2l6ZXN0b09iamVjdDpmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KCIgIik7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6dFsxXT10WzJdPXRbM109dFswXTticmVhaztjYXNlIDI6dFsyXT10WzBdLHRbM109dFsxXTticmVhaztjYXNlIDM6dFszXT10WzFdfXJldHVybnt0b3A6cGFyc2VJbnQodFswXSwxMCkscmlnaHQ6cGFyc2VJbnQodFsxXSwxMCksYm90dG9tOnBhcnNlSW50KHRbMl0sMTApLGxlZnQ6cGFyc2VJbnQodFszXSwxMCl9fSxnZXREcmFnOmZ1bmN0aW9uKHQpe3ZhciBuPSExLHI9ZS5vbmUodCk7cmV0dXJuIHIgaW5zdGFuY2VvZiBlLk5vZGUmJmUuQXJyYXkuZWFjaCh0aGlzLl9kcmFncyxmdW5jdGlvbihlKXtyLmNvbXBhcmVUbyhlLmdldCgibm9kZSIpKSYmKG49ZSl9KSxufSxzd2FwUG9zaXRpb246ZnVuY3Rpb24odCxuKXt0PWUuREQuRERNLmdldE5vZGUodCksbj1lLkRELkRETS5nZXROb2RlKG4pO3ZhciByPXQuZ2V0WFkoKSxpPW4uZ2V0WFkoKTtyZXR1cm4gdC5zZXRYWShpKSxuLnNldFhZKHIpLHR9LGdldE5vZGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBlLk5vZGU/dDoodCYmdC5nZXQ/ZS5XaWRnZXQmJnQgaW5zdGFuY2VvZiBlLldpZGdldD90PXQuZ2V0KCJib3VuZGluZ0JveCIpOnQ9dC5nZXQoIm5vZGUiKTp0PWUub25lKHQpLHQpfSxzd2FwTm9kZTpmdW5jdGlvbih0LG4pe3Q9ZS5ERC5ERE0uZ2V0Tm9kZSh0KSxuPWUuREQuRERNLmdldE5vZGUobik7dmFyIHI9bi5nZXQoInBhcmVudE5vZGUiKSxpPW4uZ2V0KCJuZXh0U2libGluZyIpO3JldHVybiBpPT09dD9yLmluc2VydEJlZm9yZSh0LG4pOm49PT10LmdldCgibmV4dFNpYmxpbmciKT9yLmluc2VydEJlZm9yZShuLHQpOih0LmdldCgicGFyZW50Tm9kZSIpLnJlcGxhY2VDaGlsZChuLHQpLHIuaW5zZXJ0QmVmb3JlKHQsaSkpLHR9fSksZS5uYW1lc3BhY2UoIkREIiksZS5ERC5ERE09bmV3IG59LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUiLCJiYXNlIiwieXVpLXRocm90dGxlIiwiY2xhc3NuYW1lbWFuYWdlciJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkZC1kcmFnIixmdW5jdGlvbihlLHQpe3ZhciBuPWUuREQuRERNLHI9Im5vZGUiLGk9ImRyYWdnaW5nIixzPSJkcmFnTm9kZSIsbz0ib2Zmc2V0SGVpZ2h0Iix1PSJvZmZzZXRXaWR0aCIsYT0iZHJhZzptb3VzZURvd24iLGY9ImRyYWc6YWZ0ZXJNb3VzZURvd24iLGw9ImRyYWc6cmVtb3ZlSGFuZGxlIixjPSJkcmFnOmFkZEhhbmRsZSIsaD0iZHJhZzpyZW1vdmVJbnZhbGlkIixwPSJkcmFnOmFkZEludmFsaWQiLGQ9ImRyYWc6c3RhcnQiLHY9ImRyYWc6ZW5kIixtPSJkcmFnOmRyYWciLGc9ImRyYWc6YWxpZ24iLHk9ZnVuY3Rpb24odCl7dGhpcy5fbGF6eUFkZEF0dHJzPSExLHkuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHI9bi5fcmVnRHJhZyh0aGlzKTtyfHxlLmVycm9yKCJGYWlsZWQgdG8gcmVnaXN0ZXIgbm9kZSwgYWxyZWFkeSBpbiB1c2U6ICIrdC5ub2RlKX07eS5OQU1FPSJkcmFnIix5LlNUQVJUX0VWRU5UPSJtb3VzZWRvd24iLHkuQVRUUlM9e25vZGU6e3NldHRlcjpmdW5jdGlvbih0KXtpZih0aGlzLl9jYW5EcmFnKHQpKXJldHVybiB0O3ZhciBuPWUub25lKHQpO3JldHVybiBufHxlLmVycm9yKCJERC5EcmFnOiBJbnZhbGlkIE5vZGUgR2l2ZW46ICIrdCksbn19LGRyYWdOb2RlOntzZXR0ZXI6ZnVuY3Rpb24odCl7aWYodGhpcy5fY2FuRHJhZyh0KSlyZXR1cm4gdDt2YXIgbj1lLm9uZSh0KTtyZXR1cm4gbnx8ZS5lcnJvcigiREQuRHJhZzogSW52YWxpZCBkcmFnTm9kZSBHaXZlbjogIit0KSxufX0sb2Zmc2V0Tm9kZTp7dmFsdWU6ITB9LHN0YXJ0Q2VudGVyZWQ6e3ZhbHVlOiExfSxjbGlja1BpeGVsVGhyZXNoOnt2YWx1ZTpuLmdldCgiY2xpY2tQaXhlbFRocmVzaCIpfSxjbGlja1RpbWVUaHJlc2g6e3ZhbHVlOm4uZ2V0KCJjbGlja1RpbWVUaHJlc2giKX0sbG9jazp7dmFsdWU6ITEsc2V0dGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlP3RoaXMuZ2V0KHIpLmFkZENsYXNzKG4uQ1NTX1BSRUZJWCsiLWxvY2tlZCIpOnRoaXMuZ2V0KHIpLnJlbW92ZUNsYXNzKG4uQ1NTX1BSRUZJWCsiLWxvY2tlZCIpLGV9fSxkYXRhOnt2YWx1ZTohMX0sbW92ZTp7dmFsdWU6ITB9LHVzZVNoaW06e3ZhbHVlOiEwfSxhY3RpdmVIYW5kbGU6e3ZhbHVlOiExfSxwcmltYXJ5QnV0dG9uT25seTp7dmFsdWU6ITB9LGRyYWdnaW5nOnt2YWx1ZTohMX0scGFyZW50Ont2YWx1ZTohMX0sdGFyZ2V0Ont2YWx1ZTohMSxzZXR0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2hhbmRsZVRhcmdldChlKSxlfX0sZHJhZ01vZGU6e3ZhbHVlOm51bGwsc2V0dGVyOmZ1bmN0aW9uKGUpe3JldHVybiBuLl9zZXREcmFnTW9kZShlKX19LGdyb3Vwczp7dmFsdWU6WyJkZWZhdWx0Il0sZ2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dyb3Vwcz9lLk9iamVjdC5rZXlzKHRoaXMuX2dyb3Vwcyk6KHRoaXMuX2dyb3Vwcz17fSxbXSl9LHNldHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZ3JvdXBzPWUuQXJyYXkuaGFzaCh0KSx0fX0saGFuZGxlczp7dmFsdWU6bnVsbCxzZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/KHRoaXMuX2hhbmRsZXM9e30sZS5BcnJheS5lYWNoKHQsZnVuY3Rpb24odCl7dmFyIG49dDtpZih0IGluc3RhbmNlb2YgZS5Ob2RlfHx0IGluc3RhbmNlb2YgZS5Ob2RlTGlzdCluPXQuX3l1aWQ7dGhpcy5faGFuZGxlc1tuXT10fSx0aGlzKSk6dGhpcy5faGFuZGxlcz1udWxsLHR9fSxidWJibGVzOntzZXR0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkVGFyZ2V0KGUpLGV9fSxoYWx0RG93bjp7dmFsdWU6ITB9fSxlLmV4dGVuZCh5LGUuQmFzZSx7X2NhbkRyYWc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuc2V0WFkmJmUuZ2V0WFkmJmUudGVzdCYmZS5jb250YWlucz8hMDohMX0sX2J1YmJsZVRhcmdldHM6ZS5ERC5ERE0sYWRkVG9Hcm91cDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZ3JvdXBzW2VdPSEwLG4uX2FjdGl2YXRlVGFyZ2V0cygpLHRoaXN9LHJlbW92ZUZyb21Hcm91cDpmdW5jdGlvbihlKXtyZXR1cm4gZGVsZXRlIHRoaXMuX2dyb3Vwc1tlXSxuLl9hY3RpdmF0ZVRhcmdldHMoKSx0aGlzfSx0YXJnZXQ6bnVsbCxfaGFuZGxlVGFyZ2V0OmZ1bmN0aW9uKHQpe2UuREQuRHJvcCYmKHQ9PT0hMT90aGlzLnRhcmdldCYmKG4uX3VucmVnVGFyZ2V0KHRoaXMudGFyZ2V0KSx0aGlzLnRhcmdldD1udWxsKTooZS5MYW5nLmlzT2JqZWN0KHQpfHwodD17fSksdC5idWJibGVUYXJnZXRzPXQuYnViYmxlVGFyZ2V0c3x8dGhpcy5nZXRUYXJnZXRzKCksdC5ub2RlPXRoaXMuZ2V0KHIpLHQuZ3JvdXBzPXQuZ3JvdXBzfHx0aGlzLmdldCgiZ3JvdXBzIiksdGhpcy50YXJnZXQ9bmV3IGUuREQuRHJvcCh0KSkpfSxfZ3JvdXBzOm51bGwsX2NyZWF0ZUV2ZW50czpmdW5jdGlvbigpe3RoaXMucHVibGlzaChhLHtkZWZhdWx0Rm46dGhpcy5fZGVmTW91c2VEb3duRm4scXVldWFibGU6ITEsZW1pdEZhY2FkZTohMCxidWJibGVzOiEwLHByZWZpeDoiZHJhZyJ9KSx0aGlzLnB1Ymxpc2goZyx7ZGVmYXVsdEZuOnRoaXMuX2RlZkFsaWduRm4scXVldWFibGU6ITEsZW1pdEZhY2FkZTohMCxidWJibGVzOiEwLHByZWZpeDoiZHJhZyJ9KSx0aGlzLnB1Ymxpc2gobSx7ZGVmYXVsdEZuOnRoaXMuX2RlZkRyYWdGbixxdWV1YWJsZTohMSxlbWl0RmFjYWRlOiEwLGJ1YmJsZXM6ITAscHJlZml4OiJkcmFnIn0pLHRoaXMucHVibGlzaCh2LHtkZWZhdWx0Rm46dGhpcy5fZGVmRW5kRm4scHJldmVudGVkRm46dGhpcy5fcHJldkVuZEZuLHF1ZXVhYmxlOiExLGVtaXRGYWNhZGU6ITAsYnViYmxlczohMCxwcmVmaXg6ImRyYWcifSk7dmFyIHQ9W2YsbCxjLGgscCxkLCJkcmFnOmRyb3BoaXQiLCJkcmFnOmRyb3BtaXNzIiwiZHJhZzpvdmVyIiwiZHJhZzplbnRlciIsImRyYWc6ZXhpdCJdO2UuQXJyYXkuZWFjaCh0LGZ1bmN0aW9uKGUpe3RoaXMucHVibGlzaChlLHt0eXBlOmUsZW1pdEZhY2FkZTohMCxidWJibGVzOiEwLHByZXZlbnRhYmxlOiExLHF1ZXVhYmxlOiExLHByZWZpeDoiZHJhZyJ9KX0sdGhpcyl9LF9ldl9tZDpudWxsLF9zdGFydFRpbWU6bnVsbCxfZW5kVGltZTpudWxsLF9oYW5kbGVzOm51bGwsX2ludmFsaWRzOm51bGwsX2ludmFsaWRzRGVmYXVsdDp7dGV4dGFyZWE6ITAsaW5wdXQ6ITAsYTohMCxidXR0b246ITAsc2VsZWN0OiEwfSxfZHJhZ1RocmVzaE1ldDpudWxsLF9mcm9tVGltZW91dDpudWxsLF9jbGlja1RpbWVvdXQ6bnVsbCxkZWx0YVhZOm51bGwsc3RhcnRYWTpudWxsLG5vZGVYWTpudWxsLGxhc3RYWTpudWxsLGFjdFhZOm51bGwscmVhbFhZOm51bGwsbW91c2VYWTpudWxsLHJlZ2lvbjpudWxsLF9oYW5kbGVNb3VzZVVwOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJkcmFnOm1vdXNldXAiKSx0aGlzLl9maXhJRU1vdXNlVXAoKSxuLmFjdGl2ZURyYWcmJm4uX2VuZCgpfSxfZml4RHJhZ1N0YXJ0OmZ1bmN0aW9uKGUpe3RoaXMudmFsaWRDbGljayhlKSYmZS5wcmV2ZW50RGVmYXVsdCgpfSxfaWVTZWxlY3RGaXg6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sX2llU2VsZWN0QmFjazpudWxsLF9maXhJRU1vdXNlRG93bjpmdW5jdGlvbigpe2UuVUEuaWUmJih0aGlzLl9pZVNlbGVjdEJhY2s9ZS5jb25maWcuZG9jLmJvZHkub25zZWxlY3RzdGFydCxlLmNvbmZpZy5kb2MuYm9keS5vbnNlbGVjdHN0YXJ0PXRoaXMuX2llU2VsZWN0Rml4KX0sX2ZpeElFTW91c2VVcDpmdW5jdGlvbigpe2UuVUEuaWUmJihlLmNvbmZpZy5kb2MuYm9keS5vbnNlbGVjdHN0YXJ0PXRoaXMuX2llU2VsZWN0QmFjayl9LF9oYW5kbGVNb3VzZURvd25FdmVudDpmdW5jdGlvbihlKXt0aGlzLnZhbGlkQ2xpY2soZSkmJmUucHJldmVudERlZmF1bHQoKSx0aGlzLmZpcmUoYSx7ZXY6ZX0pfSxfZGVmTW91c2VEb3duRm46ZnVuY3Rpb24odCl7dmFyIHI9dC5ldjt0aGlzLl9kcmFnVGhyZXNoTWV0PSExLHRoaXMuX2V2X21kPXI7aWYodGhpcy5nZXQoInByaW1hcnlCdXR0b25Pbmx5IikmJnIuYnV0dG9uPjEpcmV0dXJuITE7dGhpcy52YWxpZENsaWNrKHIpJiYodGhpcy5fZml4SUVNb3VzZURvd24ocikseS5TVEFSVF9FVkVOVC5pbmRleE9mKCJnZXN0dXJlIikhPT0wJiYodGhpcy5nZXQoImhhbHREb3duIik/ci5oYWx0KCk6ci5wcmV2ZW50RGVmYXVsdCgpKSx0aGlzLl9zZXRTdGFydFBvc2l0aW9uKFtyLnBhZ2VYLHIucGFnZVldKSxuLmFjdGl2ZURyYWc9dGhpcyx0aGlzLl9jbGlja1RpbWVvdXQ9ZS5sYXRlcih0aGlzLmdldCgiY2xpY2tUaW1lVGhyZXNoIiksdGhpcyx0aGlzLl90aW1lb3V0Q2hlY2spKSx0aGlzLmZpcmUoZix7ZXY6cn0pfSx2YWxpZENsaWNrOmZ1bmN0aW9uKHQpe3ZhciBuPSExLGk9ITEscz10LnRhcmdldCxvPW51bGwsdT1udWxsLGE9bnVsbCxmPSExO2lmKHRoaXMuX2hhbmRsZXMpZS5PYmplY3QuZWFjaCh0aGlzLl9oYW5kbGVzLGZ1bmN0aW9uKHQscil7dCBpbnN0YW5jZW9mIGUuTm9kZXx8dCBpbnN0YW5jZW9mIGUuTm9kZUxpc3Q/bnx8KGE9dCxhIGluc3RhbmNlb2YgZS5Ob2RlJiYoYT1uZXcgZS5Ob2RlTGlzdCh0Ll9ub2RlKSksYS5lYWNoKGZ1bmN0aW9uKGUpe2UuY29udGFpbnMocykmJihuPSEwKX0pKTplLkxhbmcuaXNTdHJpbmcocikmJnMudGVzdChyKyIsICIrcisiICoiKSYmIW8mJihvPXIsbj0hMCl9KTtlbHNle2k9dGhpcy5nZXQocik7aWYoaS5jb250YWlucyhzKXx8aS5jb21wYXJlVG8ocykpbj0hMH1yZXR1cm4gbiYmdGhpcy5faW52YWxpZHMmJmUuT2JqZWN0LmVhY2godGhpcy5faW52YWxpZHMsZnVuY3Rpb24odCxyKXtlLkxhbmcuaXNTdHJpbmcocikmJnMudGVzdChyKyIsICIrcisiICoiKSYmKG49ITEpfSksbiYmKG8/KHU9dC5jdXJyZW50VGFyZ2V0LmFsbChvKSxmPSExLHUuZWFjaChmdW5jdGlvbihlKXsoZS5jb250YWlucyhzKXx8ZS5jb21wYXJlVG8ocykpJiYhZiYmKGY9ITAsdGhpcy5zZXQoImFjdGl2ZUhhbmRsZSIsZSkpfSx0aGlzKSk6dGhpcy5zZXQoImFjdGl2ZUhhbmRsZSIsdGhpcy5nZXQocikpKSxufSxfc2V0U3RhcnRQb3NpdGlvbjpmdW5jdGlvbihlKXt0aGlzLnN0YXJ0WFk9ZSx0aGlzLm5vZGVYWT10aGlzLmxhc3RYWT10aGlzLnJlYWxYWT10aGlzLmdldChyKS5nZXRYWSgpLHRoaXMuZ2V0KCJvZmZzZXROb2RlIik/dGhpcy5kZWx0YVhZPVt0aGlzLnN0YXJ0WFlbMF0tdGhpcy5ub2RlWFlbMF0sdGhpcy5zdGFydFhZWzFdLXRoaXMubm9kZVhZWzFdXTp0aGlzLmRlbHRhWFk9WzAsMF19LF90aW1lb3V0Q2hlY2s6ZnVuY3Rpb24oKXshdGhpcy5nZXQoImxvY2siKSYmIXRoaXMuX2RyYWdUaHJlc2hNZXQmJnRoaXMuX2V2X21kJiYodGhpcy5fZnJvbVRpbWVvdXQ9dGhpcy5fZHJhZ1RocmVzaE1ldD0hMCx0aGlzLnN0YXJ0KCksdGhpcy5fYWxpZ25Ob2RlKFt0aGlzLl9ldl9tZC5wYWdlWCx0aGlzLl9ldl9tZC5wYWdlWV0sITApKX0scmVtb3ZlSGFuZGxlOmZ1bmN0aW9uKHQpe3ZhciBuPXQ7aWYodCBpbnN0YW5jZW9mIGUuTm9kZXx8dCBpbnN0YW5jZW9mIGUuTm9kZUxpc3Qpbj10Ll95dWlkO3JldHVybiB0aGlzLl9oYW5kbGVzW25dJiYoZGVsZXRlIHRoaXMuX2hhbmRsZXNbbl0sdGhpcy5maXJlKGwse2hhbmRsZTp0fSkpLHRoaXN9LGFkZEhhbmRsZTpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGVzfHwodGhpcy5faGFuZGxlcz17fSk7dmFyIG49dDtpZih0IGluc3RhbmNlb2YgZS5Ob2RlfHx0IGluc3RhbmNlb2YgZS5Ob2RlTGlzdCluPXQuX3l1aWQ7cmV0dXJuIHRoaXMuX2hhbmRsZXNbbl09dCx0aGlzLmZpcmUoYyx7aGFuZGxlOnR9KSx0aGlzfSxyZW1vdmVJbnZhbGlkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9pbnZhbGlkc1tlXSYmKHRoaXMuX2ludmFsaWRzW2VdPW51bGwsZGVsZXRlIHRoaXMuX2ludmFsaWRzW2VdLHRoaXMuZmlyZShoLHtoYW5kbGU6ZX0pKSx0aGlzfSxhZGRJbnZhbGlkOmZ1bmN0aW9uKHQpe3JldHVybiBlLkxhbmcuaXNTdHJpbmcodCkmJih0aGlzLl9pbnZhbGlkc1t0XT0hMCx0aGlzLmZpcmUocCx7aGFuZGxlOnR9KSksdGhpc30saW5pdGlhbGl6ZXI6ZnVuY3Rpb24oCil7dGhpcy5nZXQocikuZGQ9dGhpcztpZighdGhpcy5nZXQocikuZ2V0KCJpZCIpKXt2YXIgdD1lLnN0YW1wKHRoaXMuZ2V0KHIpKTt0aGlzLmdldChyKS5zZXQoImlkIix0KX10aGlzLmFjdFhZPVtdLHRoaXMuX2ludmFsaWRzPWUuY2xvbmUodGhpcy5faW52YWxpZHNEZWZhdWx0LCEwKSx0aGlzLl9jcmVhdGVFdmVudHMoKSx0aGlzLmdldChzKXx8dGhpcy5zZXQocyx0aGlzLmdldChyKSksdGhpcy5vbigiaW5pdGlhbGl6ZWRDaGFuZ2UiLGUuYmluZCh0aGlzLl9wcmVwLHRoaXMpKSx0aGlzLnNldCgiZ3JvdXBzIix0aGlzLmdldCgiZ3JvdXBzIikpfSxfcHJlcDpmdW5jdGlvbigpe3RoaXMuX2RyYWdUaHJlc2hNZXQ9ITE7dmFyIHQ9dGhpcy5nZXQocik7dC5hZGRDbGFzcyhuLkNTU19QUkVGSVgrIi1kcmFnZ2FibGUiKSx0Lm9uKHkuU1RBUlRfRVZFTlQsZS5iaW5kKHRoaXMuX2hhbmRsZU1vdXNlRG93bkV2ZW50LHRoaXMpKSx0Lm9uKCJtb3VzZXVwIixlLmJpbmQodGhpcy5faGFuZGxlTW91c2VVcCx0aGlzKSksdC5vbigiZHJhZ3N0YXJ0IixlLmJpbmQodGhpcy5fZml4RHJhZ1N0YXJ0LHRoaXMpKX0sX3VucHJlcDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHIpO2UucmVtb3ZlQ2xhc3Mobi5DU1NfUFJFRklYKyItZHJhZ2dhYmxlIiksZS5kZXRhY2hBbGwoIm1vdXNldXAiKSxlLmRldGFjaEFsbCgiZHJhZ3N0YXJ0IiksZS5kZXRhY2hBbGwoeS5TVEFSVF9FVkVOVCksdGhpcy5tb3VzZVhZPVtdLHRoaXMuZGVsdGFYWT1bMCwwXSx0aGlzLnN0YXJ0WFk9W10sdGhpcy5ub2RlWFk9W10sdGhpcy5sYXN0WFk9W10sdGhpcy5hY3RYWT1bXSx0aGlzLnJlYWxYWT1bXX0sc3RhcnQ6ZnVuY3Rpb24oKXtpZighdGhpcy5nZXQoImxvY2siKSYmIXRoaXMuZ2V0KGkpKXt2YXIgZT10aGlzLmdldChyKSx0LGEsZjt0aGlzLl9zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCksbi5fc3RhcnQoKSxlLmFkZENsYXNzKG4uQ1NTX1BSRUZJWCsiLWRyYWdnaW5nIiksdGhpcy5maXJlKGQse3BhZ2VYOnRoaXMubm9kZVhZWzBdLHBhZ2VZOnRoaXMubm9kZVhZWzFdLHN0YXJ0VGltZTp0aGlzLl9zdGFydFRpbWV9KSxlPXRoaXMuZ2V0KHMpLGY9dGhpcy5ub2RlWFksdD1lLmdldCh1KSxhPWUuZ2V0KG8pLHRoaXMuZ2V0KCJzdGFydENlbnRlcmVkIikmJnRoaXMuX3NldFN0YXJ0UG9zaXRpb24oW2ZbMF0rdC8yLGZbMV0rYS8yXSksdGhpcy5yZWdpb249ezA6ZlswXSwxOmZbMV0sYXJlYTowLHRvcDpmWzFdLHJpZ2h0OmZbMF0rdCxib3R0b206ZlsxXSthLGxlZnQ6ZlswXX0sdGhpcy5zZXQoaSwhMCl9cmV0dXJuIHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX2NsaWNrVGltZW91dCYmdGhpcy5fY2xpY2tUaW1lb3V0LmNhbmNlbCgpLHRoaXMuX2RyYWdUaHJlc2hNZXQ9dGhpcy5fZnJvbVRpbWVvdXQ9ITEsIXRoaXMuZ2V0KCJsb2NrIikmJnRoaXMuZ2V0KGkpJiZ0aGlzLmZpcmUodix7cGFnZVg6dGhpcy5sYXN0WFlbMF0scGFnZVk6dGhpcy5sYXN0WFlbMV0sc3RhcnRUaW1lOnRoaXMuX3N0YXJ0VGltZSxlbmRUaW1lOnRoaXMuX2VuZFRpbWV9KSx0aGlzLmdldChyKS5yZW1vdmVDbGFzcyhuLkNTU19QUkVGSVgrIi1kcmFnZ2luZyIpLHRoaXMuc2V0KGksITEpLHRoaXMuZGVsdGFYWT1bMCwwXSx0aGlzfSxfZGVmRW5kRm46ZnVuY3Rpb24oKXt0aGlzLl9maXhJRU1vdXNlVXAoKSx0aGlzLl9ldl9tZD1udWxsfSxfcHJldkVuZEZuOmZ1bmN0aW9uKCl7dGhpcy5fZml4SUVNb3VzZVVwKCksdGhpcy5nZXQocykuc2V0WFkodGhpcy5ub2RlWFkpLHRoaXMuX2V2X21kPW51bGwsdGhpcy5yZWdpb249bnVsbH0sX2FsaWduOmZ1bmN0aW9uKGUpe3RoaXMuZmlyZShnLHtwYWdlWDplWzBdLHBhZ2VZOmVbMV19KX0sX2RlZkFsaWduRm46ZnVuY3Rpb24oZSl7dGhpcy5hY3RYWT1bZS5wYWdlWC10aGlzLmRlbHRhWFlbMF0sZS5wYWdlWS10aGlzLmRlbHRhWFlbMV1dfSxfYWxpZ25Ob2RlOmZ1bmN0aW9uKGUsdCl7dGhpcy5fYWxpZ24oZSksdHx8dGhpcy5fbW92ZU5vZGUoKX0sX21vdmVOb2RlOmZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W10scj10aGlzLm5vZGVYWSxpPXRoaXMuYWN0WFk7dFswXT1pWzBdLXRoaXMubGFzdFhZWzBdLHRbMV09aVsxXS10aGlzLmxhc3RYWVsxXSxuWzBdPWlbMF0tdGhpcy5ub2RlWFlbMF0sblsxXT1pWzFdLXRoaXMubm9kZVhZWzFdLHRoaXMucmVnaW9uPXswOmlbMF0sMTppWzFdLGFyZWE6MCx0b3A6aVsxXSxyaWdodDppWzBdK3RoaXMuZ2V0KHMpLmdldCh1KSxib3R0b206aVsxXSt0aGlzLmdldChzKS5nZXQobyksbGVmdDppWzBdfSx0aGlzLmZpcmUobSx7cGFnZVg6aVswXSxwYWdlWTppWzFdLHNjcm9sbDplLGluZm86e3N0YXJ0OnIseHk6aSxkZWx0YTp0LG9mZnNldDpufX0pLHRoaXMubGFzdFhZPWl9LF9kZWZEcmFnRm46ZnVuY3Rpb24odCl7aWYodGhpcy5nZXQoIm1vdmUiKSl7aWYodC5zY3JvbGwmJnQuc2Nyb2xsLm5vZGUpe3ZhciBuPXQuc2Nyb2xsLm5vZGUuZ2V0RE9NTm9kZSgpO249PT1lLmNvbmZpZy53aW4/bi5zY3JvbGxUbyh0LnNjcm9sbC5sZWZ0LHQuc2Nyb2xsLnRvcCk6KHQuc2Nyb2xsLm5vZGUuc2V0KCJzY3JvbGxUb3AiLHQuc2Nyb2xsLnRvcCksdC5zY3JvbGwubm9kZS5zZXQoInNjcm9sbExlZnQiLHQuc2Nyb2xsLmxlZnQpKX10aGlzLmdldChzKS5zZXRYWShbdC5wYWdlWCx0LnBhZ2VZXSksdGhpcy5yZWFsWFk9W3QucGFnZVgsdC5wYWdlWV19fSxfbW92ZTpmdW5jdGlvbihlKXtpZih0aGlzLmdldCgibG9jayIpKXJldHVybiExO3RoaXMubW91c2VYWT1bZS5wYWdlWCxlLnBhZ2VZXTtpZighdGhpcy5fZHJhZ1RocmVzaE1ldCl7dmFyIHQ9TWF0aC5hYnModGhpcy5zdGFydFhZWzBdLWUucGFnZVgpLG49TWF0aC5hYnModGhpcy5zdGFydFhZWzFdLWUucGFnZVkpO2lmKHQ+dGhpcy5nZXQoImNsaWNrUGl4ZWxUaHJlc2giKXx8bj50aGlzLmdldCgiY2xpY2tQaXhlbFRocmVzaCIpKXRoaXMuX2RyYWdUaHJlc2hNZXQ9ITAsdGhpcy5zdGFydCgpLGUmJmUucHJldmVudERlZmF1bHQmJmUucHJldmVudERlZmF1bHQoKSx0aGlzLl9hbGlnbk5vZGUoW2UucGFnZVgsZS5wYWdlWV0pfWVsc2UgdGhpcy5fY2xpY2tUaW1lb3V0JiZ0aGlzLl9jbGlja1RpbWVvdXQuY2FuY2VsKCksdGhpcy5fYWxpZ25Ob2RlKFtlLnBhZ2VYLGUucGFnZVldKX0sc3RvcERyYWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoaSkmJm4uX2VuZCgpLHRoaXN9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl91bnByZXAoKSx0aGlzLnRhcmdldCYmdGhpcy50YXJnZXQuZGVzdHJveSgpLG4uX3VucmVnRHJhZyh0aGlzKX19KSxlLm5hbWVzcGFjZSgiREQiKSxlLkRELkRyYWc9eX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZGQtZGRtLWJhc2UiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiZGQtcGx1Z2luIixmdW5jdGlvbihlLHQpe3ZhciBuPWZ1bmN0aW9uKHQpe2UuV2lkZ2V0JiZ0Lmhvc3QgaW5zdGFuY2VvZiBlLldpZGdldD8odC5ub2RlPXQuaG9zdC5nZXQoImJvdW5kaW5nQm94IiksdC53aWRnZXQ9dC5ob3N0KToodC5ub2RlPXQuaG9zdCx0LndpZGdldD0hMSksbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyx0KX0scj0iZHJhZzpzdGFydCIsaT0iZHJhZzpkcmFnIixzPSJkcmFnOmVuZCI7bi5OQU1FPSJkZC1wbHVnaW4iLG4uTlM9ImRkIixlLmV4dGVuZChuLGUuREQuRHJhZyx7X3dpZGdldEhhbmRsZXM6bnVsbCxfd2lkZ2V0OnVuZGVmaW5lZCxfc3RvcHBlZFBvc2l0aW9uOnVuZGVmaW5lZCxfdXNlc1dpZGdldFBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPSExO3JldHVybiB0JiYobj10Lmhhc0ltcGwmJnQuaGFzSW1wbChlLldpZGdldFBvc2l0aW9uKT8hMDohMSksbn0sX2NoZWNrRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy5fd2lkZ2V0JiYodGhpcy5wcm94eT90aGlzLl93aWRnZXRIYW5kbGVzLmxlbmd0aD4wJiZ0aGlzLl9yZW1vdmVXaWRnZXRMaXN0ZW5lcnMoKTp0aGlzLl93aWRnZXRIYW5kbGVzLmxlbmd0aD09PTAmJnRoaXMuX2F0dGFjaFdpZGdldExpc3RlbmVycygpKX0sX3JlbW92ZVdpZGdldExpc3RlbmVyczpmdW5jdGlvbigpe2UuQXJyYXkuZWFjaCh0aGlzLl93aWRnZXRIYW5kbGVzLGZ1bmN0aW9uKGUpe2UuZGV0YWNoKCl9KSx0aGlzLl93aWRnZXRIYW5kbGVzPVtdfSxfYXR0YWNoV2lkZ2V0TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdXNlc1dpZGdldFBvc2l0aW9uKHRoaXMuX3dpZGdldCkmJih0aGlzLl93aWRnZXRIYW5kbGVzLnB1c2godGhpcy5vbihpLHRoaXMuX3NldFdpZGdldENvb3JkcykpLHRoaXMuX3dpZGdldEhhbmRsZXMucHVzaCh0aGlzLm9uKHMsdGhpcy5fdXBkYXRlU3RvcFBvc2l0aW9uKSkpfSxpbml0aWFsaXplcjpmdW5jdGlvbihlKXt0aGlzLl93aWRnZXRIYW5kbGVzPVtdLHRoaXMuX3dpZGdldD1lLndpZGdldCx0aGlzLm9uKHIsdGhpcy5fY2hlY2tFdmVudHMpLHRoaXMuX2F0dGFjaFdpZGdldExpc3RlbmVycygpfSxfc2V0V2lkZ2V0Q29vcmRzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3N0b3BwZWRQb3NpdGlvbnx8ZS50YXJnZXQubm9kZVhZLG49ZS50YXJnZXQucmVhbFhZLHI9W25bMF0tdFswXSxuWzFdLXRbMV1dO3JbMF0hPT0wJiZyWzFdIT09MD90aGlzLl93aWRnZXQuc2V0KCJ4eSIsbik6clswXT09PTA/dGhpcy5fd2lkZ2V0LnNldCgieSIsblsxXSk6clsxXT09PTAmJnRoaXMuX3dpZGdldC5zZXQoIngiLG5bMF0pfSxfdXBkYXRlU3RvcFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3RoaXMuX3N0b3BwZWRQb3NpdGlvbj1lLnRhcmdldC5yZWFsWFl9fSksZS5uYW1lc3BhY2UoIlBsdWdpbiIpLGUuUGx1Z2luLkRyYWc9bn0sIjMuMTcuMiIse29wdGlvbmFsOlsiZGQtY29uc3RyYWluIiwiZGQtcHJveHkiXSxyZXF1aXJlczpbImRkLWRyYWciXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiY2FjaGUtYmFzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLkxhbmcscj1lLkxhbmcuaXNEYXRlLGk9ZnVuY3Rpb24oKXtpLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtlLm1peChpLHtOQU1FOiJjYWNoZSIsQVRUUlM6e21heDp7dmFsdWU6MCxzZXR0ZXI6Il9zZXRNYXgifSxzaXplOntyZWFkT25seTohMCxnZXR0ZXI6Il9nZXRTaXplIn0sdW5pcXVlS2V5czp7dmFsdWU6ITF9LGV4cGlyZXM6e3ZhbHVlOjAsdmFsaWRhdG9yOmZ1bmN0aW9uKHQpe3JldHVybiBlLkxhbmcuaXNEYXRlKHQpfHxlLkxhbmcuaXNOdW1iZXIodCkmJnQ+PTB9fSxlbnRyaWVzOntyZWFkT25seTohMCxnZXR0ZXI6Il9nZXRFbnRyaWVzIn19fSksZS5leHRlbmQoaSxlLkJhc2Use19lbnRyaWVzOm51bGwsaW5pdGlhbGl6ZXI6ZnVuY3Rpb24oZSl7dGhpcy5wdWJsaXNoKCJhZGQiLHtkZWZhdWx0Rm46dGhpcy5fZGVmQWRkRm59KSx0aGlzLnB1Ymxpc2goImZsdXNoIix7ZGVmYXVsdEZuOnRoaXMuX2RlZkZsdXNoRm59KSx0aGlzLl9lbnRyaWVzPVtdfSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fZW50cmllcz1bXX0sX3NldE1heDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzO2lmKGU+MCl7aWYodCl3aGlsZSh0Lmxlbmd0aD5lKXQuc2hpZnQoKX1lbHNlIGU9MCx0aGlzLl9lbnRyaWVzPVtdO3JldHVybiBlfSxfZ2V0U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbnRyaWVzLmxlbmd0aH0sX2dldEVudHJpZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW50cmllc30sX2RlZkFkZEZuOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2VudHJpZXMscj1lLmVudHJ5LGk9dGhpcy5nZXQoIm1heCIpLHM7dGhpcy5nZXQoInVuaXF1ZUtleXMiKSYmKHM9dGhpcy5fcG9zaXRpb24oZS5lbnRyeS5yZXF1ZXN0KSxuLmlzVmFsdWUocykmJnQuc3BsaWNlKHMsMSkpO3doaWxlKGkmJnQubGVuZ3RoPj1pKXQuc2hpZnQoKTt0W3QubGVuZ3RoXT1yfSxfZGVmRmx1c2hGbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzLHI9ZS5kZXRhaWxzWzBdLGk7ciYmbi5pc1ZhbHVlKHIucmVxdWVzdCk/KGk9dGhpcy5fcG9zaXRpb24oci5yZXF1ZXN0KSxuLmlzVmFsdWUoaSkmJnQuc3BsaWNlKGksMSkpOnRoaXMuX2VudHJpZXM9W119LF9pc01hdGNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIXQuZXhwaXJlc3x8bmV3IERhdGU8dC5leHBpcmVzP2U9PT10LnJlcXVlc3Q6ITF9LF9wb3NpdGlvbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzLG49dC5sZW5ndGgscj1uLTE7aWYodGhpcy5nZXQoIm1heCIpPT09bnVsbHx8dGhpcy5nZXQoIm1heCIpPjApZm9yKDtyPj0wO3ItLSlpZih0aGlzLl9pc01hdGNoKGUsdFtyXSkpcmV0dXJuIHI7cmV0dXJuIG51bGx9LGFkZDpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuZ2V0KCJleHBpcmVzIik7dGhpcy5nZXQoImluaXRpYWxpemVkIikmJih0aGlzLmdldCgibWF4Iik9PT1udWxsfHx0aGlzLmdldCgibWF4Iik+MCkmJihuLmlzVmFsdWUoZSl8fG4uaXNOdWxsKGUpfHxuLmlzVW5kZWZpbmVkKGUpKSYmdGhpcy5maXJlKCJhZGQiLHtlbnRyeTp7cmVxdWVzdDplLHJlc3BvbnNlOnQsY2FjaGVkOm5ldyBEYXRlLGV4cGlyZXM6cihpKT9pOmk/bmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrdGhpcy5nZXQoImV4cGlyZXMiKSk6bnVsbH19KX0sZmx1c2g6ZnVuY3Rpb24oZSl7dGhpcy5maXJlKCJmbHVzaCIse3JlcXVlc3Q6bi5pc1ZhbHVlKGUpP2U6bnVsbH0pfSxyZXRyaWV2ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzLHI9dC5sZW5ndGgsaT1udWxsLHM7aWYocj4wJiYodGhpcy5nZXQoIm1heCIpPT09bnVsbHx8dGhpcy5nZXQoIm1heCIpPjApKXt0aGlzLmZpcmUoInJlcXVlc3QiLHtyZXF1ZXN0OmV9KSxzPXRoaXMuX3Bvc2l0aW9uKGUpO2lmKG4uaXNWYWx1ZShzKSlyZXR1cm4gaT10W3NdLHRoaXMuZmlyZSgicmV0cmlldmUiLHtlbnRyeTppfSksczxyLTEmJih0LnNwbGljZShzLDEpLHRbdC5sZW5ndGhdPWkpLGl9cmV0dXJuIG51bGx9fSksZS5DYWNoZT1pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJiYXNlIl19KTsKdmFyIFkgPSBZVUkoKS51c2UoJyonKTs=
Protocol
HTTP/1.1
Server
194.66.87.68 , United Kingdom, ASN786 (JANET Jisc Services Limited, GB),
Reverse DNS
campusmoodle.rgu.ac.uk
Software
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4 / PHP/7.1.4
Resource Hash
ed623c5b0e8b71a1c6966862502d4879ebc3aa2b521eaba96bbfcc35e6f13f3b

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sun, 06 Sep 2020 09:31:39 GMT
Content-Encoding
gzip
X-Powered-By
PHP/7.1.4
Content-Disposition
inline; filename="combo"
Connection
Keep-Alive
Content-Length
6163
Pragma
Last-Modified
Fri, 19 Apr 2019 09:00:08 GMT
Server
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4
Etag
"89e73dc7377deeafc8bd3ce3a009e091aa610fa2"
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
public, max-age=31104000, immutable
Accept-Ranges
none
Keep-Alive
timeout=5, max=100
Expires
Wed, 01 Sep 2021 09:31:39 GMT
event.js
campusmoodle.rgu.ac.uk/lib/requirejs.php/1591866501/core/
877 KB
209 KB
Script
General
Full URL
http://campusmoodle.rgu.ac.uk/lib/requirejs.php/1591866501/core/event.js
Requested by
Host: application
URL: data:application/javascript;base64,dmFyIHJlcXVpcmVqcyxyZXF1aXJlLGRlZmluZTshZnVuY3Rpb24oZ2xvYmFsLHNldFRpbWVvdXQpe2Z1bmN0aW9uIGNvbW1lbnRSZXBsYWNlKGUsdCl7cmV0dXJuIHR8fCIifWZ1bmN0aW9uIGlzRnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09PW9zdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBpc0FycmF5KGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1vc3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gZWFjaChlLHQpe2lmKGUpe3ZhciBpO2ZvcihpPTA7aTxlLmxlbmd0aCYmKCFlW2ldfHwhdChlW2ldLGksZSkpO2krPTEpO319ZnVuY3Rpb24gZWFjaFJldmVyc2UoZSx0KXtpZihlKXt2YXIgaTtmb3IoaT1lLmxlbmd0aC0xO2k+LTEmJighZVtpXXx8IXQoZVtpXSxpLGUpKTtpLT0xKTt9fWZ1bmN0aW9uIGhhc1Byb3AoZSx0KXtyZXR1cm4gaGFzT3duLmNhbGwoZSx0KX1mdW5jdGlvbiBnZXRPd24oZSx0KXtyZXR1cm4gaGFzUHJvcChlLHQpJiZlW3RdfWZ1bmN0aW9uIGVhY2hQcm9wKGUsdCl7dmFyIGk7Zm9yKGkgaW4gZSlpZihoYXNQcm9wKGUsaSkmJnQoZVtpXSxpKSlicmVha31mdW5jdGlvbiBtaXhpbihlLHQsaSxyKXtyZXR1cm4gdCYmZWFjaFByb3AodCxmdW5jdGlvbih0LG4peyFpJiZoYXNQcm9wKGUsbil8fCghcnx8Im9iamVjdCIhPXR5cGVvZiB0fHwhdHx8aXNBcnJheSh0KXx8aXNGdW5jdGlvbih0KXx8dCBpbnN0YW5jZW9mIFJlZ0V4cD9lW25dPXQ6KGVbbl18fChlW25dPXt9KSxtaXhpbihlW25dLHQsaSxyKSkpfSksZX1mdW5jdGlvbiBiaW5kKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX1mdW5jdGlvbiBzY3JpcHRzKCl7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKX1mdW5jdGlvbiBkZWZhdWx0T25FcnJvcihlKXt0aHJvdyBlfWZ1bmN0aW9uIGdldEdsb2JhbChlKXtpZighZSlyZXR1cm4gZTt2YXIgdD1nbG9iYWw7cmV0dXJuIGVhY2goZS5zcGxpdCgiLiIpLGZ1bmN0aW9uKGUpe3Q9dFtlXX0pLHR9ZnVuY3Rpb24gbWFrZUVycm9yKGUsdCxpLHIpe3ZhciBuPW5ldyBFcnJvcih0KyJcbmh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjIitlKTtyZXR1cm4gbi5yZXF1aXJlVHlwZT1lLG4ucmVxdWlyZU1vZHVsZXM9cixpJiYobi5vcmlnaW5hbEVycm9yPWkpLG59ZnVuY3Rpb24gbmV3Q29udGV4dChlKXtmdW5jdGlvbiB0KGUpe3ZhciB0LGk7Zm9yKHQ9MDt0PGUubGVuZ3RoO3QrKylpZigiLiI9PT0oaT1lW3RdKSllLnNwbGljZSh0LDEpLHQtPTE7ZWxzZSBpZigiLi4iPT09aSl7aWYoMD09PXR8fDE9PT10JiYiLi4iPT09ZVsyXXx8Ii4uIj09PWVbdC0xXSljb250aW51ZTt0PjAmJihlLnNwbGljZSh0LTEsMiksdC09Mil9fWZ1bmN0aW9uIGkoZSxpLHIpe3ZhciBuLG8sYSxzLHUsYyxkLHAsZixsLGg9aSYmaS5zcGxpdCgiLyIpLG09eS5tYXAsZz1tJiZtWyIqIl07aWYoZSYmKGM9KGU9ZS5zcGxpdCgiLyIpKS5sZW5ndGgtMSx5Lm5vZGVJZENvbXBhdCYmanNTdWZmaXhSZWdFeHAudGVzdChlW2NdKSYmKGVbY109ZVtjXS5yZXBsYWNlKGpzU3VmZml4UmVnRXhwLCIiKSksIi4iPT09ZVswXS5jaGFyQXQoMCkmJmgmJihlPWguc2xpY2UoMCxoLmxlbmd0aC0xKS5jb25jYXQoZSkpLHQoZSksZT1lLmpvaW4oIi8iKSksciYmbSYmKGh8fGcpKXtlOmZvcihhPShvPWUuc3BsaXQoIi8iKSkubGVuZ3RoO2E+MDthLT0xKXtpZih1PW8uc2xpY2UoMCxhKS5qb2luKCIvIiksaClmb3Iocz1oLmxlbmd0aDtzPjA7cy09MSlpZigobj1nZXRPd24obSxoLnNsaWNlKDAscykuam9pbigiLyIpKSkmJihuPWdldE93bihuLHUpKSl7ZD1uLHA9YTticmVhayBlfSFmJiZnJiZnZXRPd24oZyx1KSYmKGY9Z2V0T3duKGcsdSksbD1hKX0hZCYmZiYmKGQ9ZixwPWwpLGQmJihvLnNwbGljZSgwLHAsZCksZT1vLmpvaW4oIi8iKSl9cmV0dXJuIGdldE93bih5LnBrZ3MsZSl8fGV9ZnVuY3Rpb24gcihlKXtpc0Jyb3dzZXImJmVhY2goc2NyaXB0cygpLGZ1bmN0aW9uKHQpe2lmKHQuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVtb2R1bGUiKT09PWUmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVjb250ZXh0Iik9PT1xLmNvbnRleHROYW1lKXJldHVybiB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksITB9KX1mdW5jdGlvbiBuKGUpe3ZhciB0PWdldE93bih5LnBhdGhzLGUpO2lmKHQmJmlzQXJyYXkodCkmJnQubGVuZ3RoPjEpcmV0dXJuIHQuc2hpZnQoKSxxLnJlcXVpcmUudW5kZWYoZSkscS5tYWtlUmVxdWlyZShudWxsLHtza2lwTWFwOiEwfSkoW2VdKSwhMH1mdW5jdGlvbiBvKGUpe3ZhciB0LGk9ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gaT4tMSYmKHQ9ZS5zdWJzdHJpbmcoMCxpKSxlPWUuc3Vic3RyaW5nKGkrMSxlLmxlbmd0aCkpLFt0LGVdfWZ1bmN0aW9uIGEoZSx0LHIsbil7dmFyIGEscyx1LGMsZD1udWxsLHA9dD90Lm5hbWU6bnVsbCxmPWUsbD0hMCxoPSIiO3JldHVybiBlfHwobD0hMSxlPSJfQHIiKyhUKz0xKSksYz1vKGUpLGQ9Y1swXSxlPWNbMV0sZCYmKGQ9aShkLHAsbikscz1nZXRPd24oaixkKSksZSYmKGQ/aD1yP2U6cyYmcy5ub3JtYWxpemU/cy5ub3JtYWxpemUoZSxmdW5jdGlvbihlKXtyZXR1cm4gaShlLHAsbil9KTotMT09PWUuaW5kZXhPZigiISIpP2koZSxwLG4pOmU6KGQ9KGM9byhoPWkoZSxwLG4pKSlbMF0saD1jWzFdLHI9ITAsYT1xLm5hbWVUb1VybChoKSkpLHU9IWR8fHN8fHI/IiI6Il91bm5vcm1hbGl6ZWQiKyhBKz0xKSx7cHJlZml4OmQsbmFtZTpoLHBhcmVudE1hcDp0LHVubm9ybWFsaXplZDohIXUsdXJsOmEsb3JpZ2luYWxOYW1lOmYsaXNEZWZpbmU6bCxpZDooZD9kKyIhIitoOmgpK3V9fWZ1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5pZCxpPWdldE93bihTLHQpO3JldHVybiBpfHwoaT1TW3RdPW5ldyBxLk1vZHVsZShlKSksaX1mdW5jdGlvbiB1KGUsdCxpKXt2YXIgcj1lLmlkLG49Z2V0T3duKFMscik7IWhhc1Byb3AoaixyKXx8biYmIW4uZGVmaW5lRW1pdENvbXBsZXRlPyhuPXMoZSkpLmVycm9yJiYiZXJyb3IiPT09dD9pKG4uZXJyb3IpOm4ub24odCxpKToiZGVmaW5lZCI9PT10JiZpKGpbcl0pfWZ1bmN0aW9uIGMoZSx0KXt2YXIgaT1lLnJlcXVpcmVNb2R1bGVzLHI9ITE7dD90KGUpOihlYWNoKGksZnVuY3Rpb24odCl7dmFyIGk9Z2V0T3duKFMsdCk7aSYmKGkuZXJyb3I9ZSxpLmV2ZW50cy5lcnJvciYmKHI9ITAsaS5lbWl0KCJlcnJvciIsZSkpKX0pLHJ8fHJlcS5vbkVycm9yKGUpKX1mdW5jdGlvbiBkKCl7Z2xvYmFsRGVmUXVldWUubGVuZ3RoJiYoZWFjaChnbG9iYWxEZWZRdWV1ZSxmdW5jdGlvbihlKXt2YXIgdD1lWzBdOyJzdHJpbmciPT10eXBlb2YgdCYmKHEuZGVmUXVldWVNYXBbdF09ITApLE8ucHVzaChlKX0pLGdsb2JhbERlZlF1ZXVlPVtdKX1mdW5jdGlvbiBwKGUpe2RlbGV0ZSBTW2VdLGRlbGV0ZSBrW2VdfWZ1bmN0aW9uIGYoZSx0LGkpe3ZhciByPWUubWFwLmlkO2UuZXJyb3I/ZS5lbWl0KCJlcnJvciIsZS5lcnJvcik6KHRbcl09ITAsZWFjaChlLmRlcE1hcHMsZnVuY3Rpb24ocixuKXt2YXIgbz1yLmlkLGE9Z2V0T3duKFMsbyk7IWF8fGUuZGVwTWF0Y2hlZFtuXXx8aVtvXXx8KGdldE93bih0LG8pPyhlLmRlZmluZURlcChuLGpbb10pLGUuY2hlY2soKSk6ZihhLHQsaSkpfSksaVtyXT0hMCl9ZnVuY3Rpb24gbCgpe3ZhciBlLHQsaT0xZTMqeS53YWl0U2Vjb25kcyxvPWkmJnEuc3RhcnRUaW1lK2k8KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1bXSxzPVtdLHU9ITEsZD0hMDtpZigheCl7aWYoeD0hMCxlYWNoUHJvcChrLGZ1bmN0aW9uKGUpe3ZhciBpPWUubWFwLGM9aS5pZDtpZihlLmVuYWJsZWQmJihpLmlzRGVmaW5lfHxzLnB1c2goZSksIWUuZXJyb3IpKWlmKCFlLmluaXRlZCYmbyluKGMpPyh0PSEwLHU9ITApOihhLnB1c2goYykscihjKSk7ZWxzZSBpZighZS5pbml0ZWQmJmUuZmV0Y2hlZCYmaS5pc0RlZmluZSYmKHU9ITAsIWkucHJlZml4KSlyZXR1cm4gZD0hMX0pLG8mJmEubGVuZ3RoKXJldHVybiBlPW1ha2VFcnJvcigidGltZW91dCIsIkxvYWQgdGltZW91dCBmb3IgbW9kdWxlczogIithLG51bGwsYSksZS5jb250ZXh0TmFtZT1xLmNvbnRleHROYW1lLGMoZSk7ZCYmZWFjaChzLGZ1bmN0aW9uKGUpe2YoZSx7fSx7fSl9KSxvJiYhdHx8IXV8fCFpc0Jyb3dzZXImJiFpc1dlYldvcmtlcnx8d3x8KHc9c2V0VGltZW91dChmdW5jdGlvbigpe3c9MCxsKCl9LDUwKSkseD0hMX19ZnVuY3Rpb24gaChlKXtoYXNQcm9wKGosZVswXSl8fHMoYShlWzBdLG51bGwsITApKS5pbml0KGVbMV0sZVsyXSl9ZnVuY3Rpb24gbShlLHQsaSxyKXtlLmRldGFjaEV2ZW50JiYhaXNPcGVyYT9yJiZlLmRldGFjaEV2ZW50KHIsdCk6ZS5yZW1vdmVFdmVudExpc3RlbmVyKGksdCwhMSl9ZnVuY3Rpb24gZyhlKXt2YXIgdD1lLmN1cnJlbnRUYXJnZXR8fGUuc3JjRWxlbWVudDtyZXR1cm4gbSh0LHEub25TY3JpcHRMb2FkLCJsb2FkIiwib25yZWFkeXN0YXRlY2hhbmdlIiksbSh0LHEub25TY3JpcHRFcnJvciwiZXJyb3IiKSx7bm9kZTp0LGlkOnQmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVtb2R1bGUiKX19ZnVuY3Rpb24gdigpe3ZhciBlO2ZvcihkKCk7Ty5sZW5ndGg7KXtpZihudWxsPT09KGU9Ty5zaGlmdCgpKVswXSlyZXR1cm4gYyhtYWtlRXJyb3IoIm1pc21hdGNoIiwiTWlzbWF0Y2hlZCBhbm9ueW1vdXMgZGVmaW5lKCkgbW9kdWxlOiAiK2VbZS5sZW5ndGgtMV0pKTtoKGUpfXEuZGVmUXVldWVNYXA9e319dmFyIHgsYixxLEUsdyx5PXt3YWl0U2Vjb25kczo3LGJhc2VVcmw6Ii4vIixwYXRoczp7fSxidW5kbGVzOnt9LHBrZ3M6e30sc2hpbTp7fSxjb25maWc6e319LFM9e30saz17fSxNPXt9LE89W10saj17fSxQPXt9LFI9e30sVD0xLEE9MTtyZXR1cm4gRT17cmVxdWlyZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXF1aXJlP2UucmVxdWlyZTplLnJlcXVpcmU9cS5tYWtlUmVxdWlyZShlLm1hcCl9LGV4cG9ydHM6ZnVuY3Rpb24oZSl7aWYoZS51c2luZ0V4cG9ydHM9ITAsZS5tYXAuaXNEZWZpbmUpcmV0dXJuIGUuZXhwb3J0cz9qW2UubWFwLmlkXT1lLmV4cG9ydHM6ZS5leHBvcnRzPWpbZS5tYXAuaWRdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubW9kdWxlP2UubW9kdWxlOmUubW9kdWxlPXtpZDplLm1hcC5pZCx1cmk6ZS5tYXAudXJsLGNvbmZpZzpmdW5jdGlvbigpe3JldHVybiBnZXRPd24oeS5jb25maWcsZS5tYXAuaWQpfHx7fX0sZXhwb3J0czplLmV4cG9ydHN8fChlLmV4cG9ydHM9e30pfX19LGI9ZnVuY3Rpb24oZSl7dGhpcy5ldmVudHM9Z2V0T3duKE0sZS5pZCl8fHt9LHRoaXMubWFwPWUsdGhpcy5zaGltPWdldE93bih5LnNoaW0sZS5pZCksdGhpcy5kZXBFeHBvcnRzPVtdLHRoaXMuZGVwTWFwcz1bXSx0aGlzLmRlcE1hdGNoZWQ9W10sdGhpcy5wbHVnaW5NYXBzPXt9LHRoaXMuZGVwQ291bnQ9MH0sYi5wcm90b3R5cGU9e2luaXQ6ZnVuY3Rpb24oZSx0LGkscil7cj1yfHx7fSx0aGlzLmluaXRlZHx8KHRoaXMuZmFjdG9yeT10LGk/dGhpcy5vbigiZXJyb3IiLGkpOnRoaXMuZXZlbnRzLmVycm9yJiYoaT1iaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5lbWl0KCJlcnJvciIsZSl9KSksdGhpcy5kZXBNYXBzPWUmJmUuc2xpY2UoMCksdGhpcy5lcnJiYWNrPWksdGhpcy5pbml0ZWQ9ITAsdGhpcy5pZ25vcmU9ci5pZ25vcmUsci5lbmFibGVkfHx0aGlzLmVuYWJsZWQ/dGhpcy5lbmFibGUoKTp0aGlzLmNoZWNrKCkpfSxkZWZpbmVEZXA6ZnVuY3Rpb24oZSx0KXt0aGlzLmRlcE1hdGNoZWRbZV18fCh0aGlzLmRlcE1hdGNoZWRbZV09ITAsdGhpcy5kZXBDb3VudC09MSx0aGlzLmRlcEV4cG9ydHNbZV09dCl9LGZldGNoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmV0Y2hlZCl7dGhpcy5mZXRjaGVkPSEwLHEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3ZhciBlPXRoaXMubWFwO2lmKCF0aGlzLnNoaW0pcmV0dXJuIGUucHJlZml4P3RoaXMuY2FsbFBsdWdpbigpOnRoaXMubG9hZCgpO3EubWFrZVJlcXVpcmUodGhpcy5tYXAse2VuYWJsZUJ1aWxkQ2FsbGJhY2s6ITB9KSh0aGlzLnNoaW0uZGVwc3x8W10sYmluZCh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGUucHJlZml4P3RoaXMuY2FsbFBsdWdpbigpOnRoaXMubG9hZCgpfSkpfX0sbG9hZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMubWFwLnVybDtQW2VdfHwoUFtlXT0hMCxxLmxvYWQodGhpcy5tYXAuaWQsZSkpfSxjaGVjazpmdW5jdGlvbigpe2lmKHRoaXMuZW5hYmxlZCYmIXRoaXMuZW5hYmxpbmcpe3ZhciBlLHQsaT10aGlzLm1hcC5pZCxyPXRoaXMuZGVwRXhwb3J0cyxuPXRoaXMuZXhwb3J0cyxvPXRoaXMuZmFjdG9yeTtpZih0aGlzLmluaXRlZCl7aWYodGhpcy5lcnJvcil0aGlzLmVtaXQoImVycm9yIix0aGlzLmVycm9yKTtlbHNlIGlmKCF0aGlzLmRlZmluaW5nKXtpZih0aGlzLmRlZmluaW5nPSEwLHRoaXMuZGVwQ291bnQ8MSYmIXRoaXMuZGVmaW5lZCl7aWYoaXNGdW5jdGlvbihvKSl7aWYodGhpcy5ldmVudHMuZXJyb3ImJnRoaXMubWFwLmlzRGVmaW5lfHxyZXEub25FcnJvciE9PWRlZmF1bHRPbkVycm9yKXRyeXtuPXEuZXhlY0NiKGksbyxyLG4pfWNhdGNoKHQpe2U9dH1lbHNlIG49cS5leGVjQ2IoaSxvLHIsbik7aWYodGhpcy5tYXAuaXNEZWZpbmUmJnZvaWQgMD09PW4mJigodD10aGlzLm1vZHVsZSk/bj10LmV4cG9ydHM6dGhpcy51c2luZ0V4cG9ydHMmJihuPXRoaXMuZXhwb3J0cykpLGUpcmV0dXJuIGUucmVxdWlyZU1hcD10aGlzLm1hcCxlLnJlcXVpcmVNb2R1bGVzPXRoaXMubWFwLmlzRGVmaW5lP1t0aGlzLm1hcC5pZF06bnVsbCxlLnJlcXVpcmVUeXBlPXRoaXMubWFwLmlzRGVmaW5lPyJkZWZpbmUiOiJyZXF1aXJlIixjKHRoaXMuZXJyb3I9ZSl9ZWxzZSBuPW87aWYodGhpcy5leHBvcnRzPW4sdGhpcy5tYXAuaXNEZWZpbmUmJiF0aGlzLmlnbm9yZSYmKGpbaV09bixyZXEub25SZXNvdXJjZUxvYWQpKXt2YXIgYT1bXTtlYWNoKHRoaXMuZGVwTWFwcyxmdW5jdGlvbihlKXthLnB1c2goZS5ub3JtYWxpemVkTWFwfHxlKX0pLHJlcS5vblJlc291cmNlTG9hZChxLHRoaXMubWFwLGEpfXAoaSksdGhpcy5kZWZpbmVkPSEwfXRoaXMuZGVmaW5pbmc9ITEsdGhpcy5kZWZpbmVkJiYhdGhpcy5kZWZpbmVFbWl0dGVkJiYodGhpcy5kZWZpbmVFbWl0dGVkPSEwLHRoaXMuZW1pdCgiZGVmaW5lZCIsdGhpcy5leHBvcnRzKSx0aGlzLmRlZmluZUVtaXRDb21wbGV0ZT0hMCl9fWVsc2UgaGFzUHJvcChxLmRlZlF1ZXVlTWFwLGkpfHx0aGlzLmZldGNoKCl9fSxjYWxsUGx1Z2luOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tYXAsdD1lLmlkLHI9YShlLnByZWZpeCk7dGhpcy5kZXBNYXBzLnB1c2gociksdShyLCJkZWZpbmVkIixiaW5kKHRoaXMsZnVuY3Rpb24ocil7dmFyIG4sbyxkLGY9Z2V0T3duKFIsdGhpcy5tYXAuaWQpLGw9dGhpcy5tYXAubmFtZSxoPXRoaXMubWFwLnBhcmVudE1hcD90aGlzLm1hcC5wYXJlbnRNYXAubmFtZTpudWxsLG09cS5tYWtlUmVxdWlyZShlLnBhcmVudE1hcCx7ZW5hYmxlQnVpbGRDYWxsYmFjazohMH0pO3JldHVybiB0aGlzLm1hcC51bm5vcm1hbGl6ZWQ/KHIubm9ybWFsaXplJiYobD1yLm5vcm1hbGl6ZShsLGZ1bmN0aW9uKGUpe3JldHVybiBpKGUsaCwhMCl9KXx8IiIpLG89YShlLnByZWZpeCsiISIrbCx0aGlzLm1hcC5wYXJlbnRNYXAsITApLHUobywiZGVmaW5lZCIsYmluZCh0aGlzLGZ1bmN0aW9uKGUpe3RoaXMubWFwLm5vcm1hbGl6ZWRNYXA9byx0aGlzLmluaXQoW10sZnVuY3Rpb24oKXtyZXR1cm4gZX0sbnVsbCx7ZW5hYmxlZDohMCxpZ25vcmU6ITB9KX0pKSx2b2lkKChkPWdldE93bihTLG8uaWQpKSYmKHRoaXMuZGVwTWFwcy5wdXNoKG8pLHRoaXMuZXZlbnRzLmVycm9yJiZkLm9uKCJlcnJvciIsYmluZCh0aGlzLGZ1bmN0aW9uKGUpe3RoaXMuZW1pdCgiZXJyb3IiLGUpfSkpLGQuZW5hYmxlKCkpKSk6Zj8odGhpcy5tYXAudXJsPXEubmFtZVRvVXJsKGYpLHZvaWQgdGhpcy5sb2FkKCkpOigobj1iaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5pbml0KFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGV9LG51bGwse2VuYWJsZWQ6ITB9KX0pKS5lcnJvcj1iaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5pbml0ZWQ9ITAsdGhpcy5lcnJvcj1lLGUucmVxdWlyZU1vZHVsZXM9W3RdLGVhY2hQcm9wKFMsZnVuY3Rpb24oZSl7MD09PWUubWFwLmlkLmluZGV4T2YodCsiX3Vubm9ybWFsaXplZCIpJiZwKGUubWFwLmlkKX0pLGMoZSl9KSxuLmZyb21UZXh0PWJpbmQodGhpcyxmdW5jdGlvbihpLHIpe3ZhciBvPWUubmFtZSx1PWEobyksZD11c2VJbnRlcmFjdGl2ZTtyJiYoaT1yKSxkJiYodXNlSW50ZXJhY3RpdmU9ITEpLHModSksaGFzUHJvcCh5LmNvbmZpZyx0KSYmKHkuY29uZmlnW29dPXkuY29uZmlnW3RdKTt0cnl7cmVxLmV4ZWMoaSl9Y2F0Y2goZSl7cmV0dXJuIGMobWFrZUVycm9yKCJmcm9tdGV4dGV2YWwiLCJmcm9tVGV4dCBldmFsIGZvciAiK3QrIiBmYWlsZWQ6ICIrZSxlLFt0XSkpfWQmJih1c2VJbnRlcmFjdGl2ZT0hMCksdGhpcy5kZXBNYXBzLnB1c2godSkscS5jb21wbGV0ZUxvYWQobyksbShbb10sbil9KSx2b2lkIHIubG9hZChlLm5hbWUsbSxuLHkpKX0pKSxxLmVuYWJsZShyLHRoaXMpLHRoaXMucGx1Z2luTWFwc1tyLmlkXT1yfSxlbmFibGU6ZnVuY3Rpb24oKXtrW3RoaXMubWFwLmlkXT10aGlzLHRoaXMuZW5hYmxlZD0hMCx0aGlzLmVuYWJsaW5nPSEwLGVhY2godGhpcy5kZXBNYXBzLGJpbmQodGhpcyxmdW5jdGlvbihlLHQpe3ZhciBpLHIsbjtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKGU9YShlLHRoaXMubWFwLmlzRGVmaW5lP3RoaXMubWFwOnRoaXMubWFwLnBhcmVudE1hcCwhMSwhdGhpcy5za2lwTWFwKSx0aGlzLmRlcE1hcHNbdF09ZSxuPWdldE93bihFLGUuaWQpKXJldHVybiB2b2lkKHRoaXMuZGVwRXhwb3J0c1t0XT1uKHRoaXMpKTt0aGlzLmRlcENvdW50Kz0xLHUoZSwiZGVmaW5lZCIsYmluZCh0aGlzLGZ1bmN0aW9uKGUpe3RoaXMudW5kZWZlZHx8KHRoaXMuZGVmaW5lRGVwKHQsZSksdGhpcy5jaGVjaygpKX0pKSx0aGlzLmVycmJhY2s/dShlLCJlcnJvciIsYmluZCh0aGlzLHRoaXMuZXJyYmFjaykpOnRoaXMuZXZlbnRzLmVycm9yJiZ1KGUsImVycm9yIixiaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5lbWl0KCJlcnJvciIsZSl9KSl9aT1lLmlkLHI9U1tpXSxoYXNQcm9wKEUsaSl8fCFyfHxyLmVuYWJsZWR8fHEuZW5hYmxlKGUsdGhpcyl9KSksZWFjaFByb3AodGhpcy5wbHVnaW5NYXBzLGJpbmQodGhpcyxmdW5jdGlvbihlKXt2YXIgdD1nZXRPd24oUyxlLmlkKTt0JiYhdC5lbmFibGVkJiZxLmVuYWJsZShlLHRoaXMpfSkpLHRoaXMuZW5hYmxpbmc9ITEsdGhpcy5jaGVjaygpfSxvbjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuZXZlbnRzW2VdO2l8fChpPXRoaXMuZXZlbnRzW2VdPVtdKSxpLnB1c2godCl9LGVtaXQ6ZnVuY3Rpb24oZSx0KXtlYWNoKHRoaXMuZXZlbnRzW2VdLGZ1bmN0aW9uKGUpe2UodCl9KSwiZXJyb3IiPT09ZSYmZGVsZXRlIHRoaXMuZXZlbnRzW2VdfX0scT17Y29uZmlnOnksY29udGV4dE5hbWU6ZSxyZWdpc3RyeTpTLGRlZmluZWQ6aix1cmxGZXRjaGVkOlAsZGVmUXVldWU6TyxkZWZRdWV1ZU1hcDp7fSxNb2R1bGU6YixtYWtlTW9kdWxlTWFwOmEsbmV4dFRpY2s6cmVxLm5leHRUaWNrLG9uRXJyb3I6Yyxjb25maWd1cmU6ZnVuY3Rpb24oZSl7aWYoZS5iYXNlVXJsJiYiLyIhPT1lLmJhc2VVcmwuY2hhckF0KGUuYmFzZVVybC5sZW5ndGgtMSkmJihlLmJhc2VVcmwrPSIvIiksInN0cmluZyI9PXR5cGVvZiBlLnVybEFyZ3Mpe3ZhciB0PWUudXJsQXJncztlLnVybEFyZ3M9ZnVuY3Rpb24oZSxpKXtyZXR1cm4oLTE9PT1pLmluZGV4T2YoIj8iKT8iPyI6IiYiKSt0fX12YXIgaT15LnNoaW0scj17cGF0aHM6ITAsYnVuZGxlczohMCxjb25maWc6ITAsbWFwOiEwfTtlYWNoUHJvcChlLGZ1bmN0aW9uKGUsdCl7clt0XT8oeVt0XXx8KHlbdF09e30pLG1peGluKHlbdF0sZSwhMCwhMCkpOnlbdF09ZX0pLGUuYnVuZGxlcyYmZWFjaFByb3AoZS5idW5kbGVzLGZ1bmN0aW9uKGUsdCl7ZWFjaChlLGZ1bmN0aW9uKGUpe2UhPT10JiYoUltlXT10KX0pfSksZS5zaGltJiYoZWFjaFByb3AoZS5zaGltLGZ1bmN0aW9uKGUsdCl7aXNBcnJheShlKSYmKGU9e2RlcHM6ZX0pLCFlLmV4cG9ydHMmJiFlLmluaXR8fGUuZXhwb3J0c0ZufHwoZS5leHBvcnRzRm49cS5tYWtlU2hpbUV4cG9ydHMoZSkpLGlbdF09ZX0pLHkuc2hpbT1pKSxlLnBhY2thZ2VzJiZlYWNoKGUucGFja2FnZXMsZnVuY3Rpb24oZSl7dmFyIHQ7dD0oZT0ic3RyaW5nIj09dHlwZW9mIGU/e25hbWU6ZX06ZSkubmFtZSxlLmxvY2F0aW9uJiYoeS5wYXRoc1t0XT1lLmxvY2F0aW9uKSx5LnBrZ3NbdF09ZS5uYW1lKyIvIisoZS5tYWlufHwibWFpbiIpLnJlcGxhY2UoY3VyckRpclJlZ0V4cCwiIikucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwiIil9KSxlYWNoUHJvcChTLGZ1bmN0aW9uKGUsdCl7ZS5pbml0ZWR8fGUubWFwLnVubm9ybWFsaXplZHx8KGUubWFwPWEodCxudWxsLCEwKSl9KSwoZS5kZXBzfHxlLmNhbGxiYWNrKSYmcS5yZXF1aXJlKGUuZGVwc3x8W10sZS5jYWxsYmFjayl9LG1ha2VTaGltRXhwb3J0czpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gZS5pbml0JiYodD1lLmluaXQuYXBwbHkoZ2xvYmFsLGFyZ3VtZW50cykpLHR8fGUuZXhwb3J0cyYmZ2V0R2xvYmFsKGUuZXhwb3J0cyl9fSxtYWtlUmVxdWlyZTpmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIG8oaSxyLHUpe3ZhciBkLHAsZjtyZXR1cm4gbi5lbmFibGVCdWlsZENhbGxiYWNrJiZyJiZpc0Z1bmN0aW9uKHIpJiYoci5fX3JlcXVpcmVKc0J1aWxkPSEwKSwic3RyaW5nIj09dHlwZW9mIGk/aXNGdW5jdGlvbihyKT9jKG1ha2VFcnJvcigicmVxdWlyZWFyZ3MiLCJJbnZhbGlkIHJlcXVpcmUgY2FsbCIpLHUpOnQmJmhhc1Byb3AoRSxpKT9FW2ldKFNbdC5pZF0pOnJlcS5nZXQ/cmVxLmdldChxLGksdCxvKToocD1hKGksdCwhMSwhMCksZD1wLmlkLGhhc1Byb3AoaixkKT9qW2RdOmMobWFrZUVycm9yKCJub3Rsb2FkZWQiLCdNb2R1bGUgbmFtZSAiJytkKyciIGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0IGZvciBjb250ZXh0OiAnK2UrKHQ/IiI6Ii4gVXNlIHJlcXVpcmUoW10pIikpKSk6KHYoKSxxLm5leHRUaWNrKGZ1bmN0aW9uKCl7digpLChmPXMoYShudWxsLHQpKSkuc2tpcE1hcD1uLnNraXBNYXAsZi5pbml0KGkscix1LHtlbmFibGVkOiEwfSksbCgpfSksbyl9cmV0dXJuIG49bnx8e30sbWl4aW4obyx7aXNCcm93c2VyOmlzQnJvd3Nlcix0b1VybDpmdW5jdGlvbihlKXt2YXIgcixuPWUubGFzdEluZGV4T2YoIi4iKSxvPWUuc3BsaXQoIi8iKVswXSxhPSIuIj09PW98fCIuLiI9PT1vO3JldHVybi0xIT09biYmKCFhfHxuPjEpJiYocj1lLnN1YnN0cmluZyhuLGUubGVuZ3RoKSxlPWUuc3Vic3RyaW5nKDAsbikpLHEubmFtZVRvVXJsKGkoZSx0JiZ0LmlkLCEwKSxyLCEwKX0sZGVmaW5lZDpmdW5jdGlvbihlKXtyZXR1cm4gaGFzUHJvcChqLGEoZSx0LCExLCEwKS5pZCl9LHNwZWNpZmllZDpmdW5jdGlvbihlKXtyZXR1cm4gZT1hKGUsdCwhMSwhMCkuaWQsaGFzUHJvcChqLGUpfHxoYXNQcm9wKFMsZSl9fSksdHx8KG8udW5kZWY9ZnVuY3Rpb24oZSl7ZCgpO3ZhciBpPWEoZSx0LCEwKSxuPWdldE93bihTLGUpO24udW5kZWZlZD0hMCxyKGUpLGRlbGV0ZSBqW2VdLGRlbGV0ZSBQW2kudXJsXSxkZWxldGUgTVtlXSxlYWNoUmV2ZXJzZShPLGZ1bmN0aW9uKHQsaSl7dFswXT09PWUmJk8uc3BsaWNlKGksMSl9KSxkZWxldGUgcS5kZWZRdWV1ZU1hcFtlXSxuJiYobi5ldmVudHMuZGVmaW5lZCYmKE1bZV09bi5ldmVudHMpLHAoZSkpfSksb30sZW5hYmxlOmZ1bmN0aW9uKGUpe2dldE93bihTLGUuaWQpJiZzKGUpLmVuYWJsZSgpfSxjb21wbGV0ZUxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQsaSxyLG89Z2V0T3duKHkuc2hpbSxlKXx8e30sYT1vLmV4cG9ydHM7Zm9yKGQoKTtPLmxlbmd0aDspe2lmKG51bGw9PT0oaT1PLnNoaWZ0KCkpWzBdKXtpZihpWzBdPWUsdClicmVhazt0PSEwfWVsc2UgaVswXT09PWUmJih0PSEwKTtoKGkpfWlmKHEuZGVmUXVldWVNYXA9e30scj1nZXRPd24oUyxlKSwhdCYmIWhhc1Byb3AoaixlKSYmciYmIXIuaW5pdGVkKXtpZighKCF5LmVuZm9yY2VEZWZpbmV8fGEmJmdldEdsb2JhbChhKSkpcmV0dXJuIG4oZSk/dm9pZCAwOmMobWFrZUVycm9yKCJub2RlZmluZSIsIk5vIGRlZmluZSBjYWxsIGZvciAiK2UsbnVsbCxbZV0pKTtoKFtlLG8uZGVwc3x8W10sby5leHBvcnRzRm5dKX1sKCl9LG5hbWVUb1VybDpmdW5jdGlvbihlLHQsaSl7dmFyIHIsbixvLGEscyx1LGMsZD1nZXRPd24oeS5wa2dzLGUpO2lmKGQmJihlPWQpLGM9Z2V0T3duKFIsZSkpcmV0dXJuIHEubmFtZVRvVXJsKGMsdCxpKTtpZihyZXEuanNFeHRSZWdFeHAudGVzdChlKSlzPWUrKHR8fCIiKTtlbHNle2ZvcihyPXkucGF0aHMsbz0obj1lLnNwbGl0KCIvIikpLmxlbmd0aDtvPjA7by09MSlpZihhPW4uc2xpY2UoMCxvKS5qb2luKCIvIiksdT1nZXRPd24ocixhKSl7aXNBcnJheSh1KSYmKHU9dVswXSksbi5zcGxpY2UoMCxvLHUpO2JyZWFrfXM9bi5qb2luKCIvIikscz0oIi8iPT09KHMrPXR8fCgvXmRhdGFcOnxeYmxvYlw6fFw/Ly50ZXN0KHMpfHxpPyIiOiIuanMiKSkuY2hhckF0KDApfHxzLm1hdGNoKC9eW1x3XCtcLlwtXSs6Lyk/IiI6eS5iYXNlVXJsKStzfXJldHVybiB5LnVybEFyZ3MmJiEvXmJsb2JcOi8udGVzdChzKT9zK3kudXJsQXJncyhlLHMpOnN9LGxvYWQ6ZnVuY3Rpb24oZSx0KXtyZXEubG9hZChxLGUsdCl9LGV4ZWNDYjpmdW5jdGlvbihlLHQsaSxyKXtyZXR1cm4gdC5hcHBseShyLGkpfSxvblNjcmlwdExvYWQ6ZnVuY3Rpb24oZSl7aWYoImxvYWQiPT09ZS50eXBlfHxyZWFkeVJlZ0V4cC50ZXN0KChlLmN1cnJlbnRUYXJnZXR8fGUuc3JjRWxlbWVudCkucmVhZHlTdGF0ZSkpe2ludGVyYWN0aXZlU2NyaXB0PW51bGw7dmFyIHQ9ZyhlKTtxLmNvbXBsZXRlTG9hZCh0LmlkKX19LG9uU2NyaXB0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQ9ZyhlKTtpZighbih0LmlkKSl7dmFyIGk9W107cmV0dXJuIGVhY2hQcm9wKFMsZnVuY3Rpb24oZSxyKXswIT09ci5pbmRleE9mKCJfQHIiKSYmZWFjaChlLmRlcE1hcHMsZnVuY3Rpb24oZSl7aWYoZS5pZD09PXQuaWQpcmV0dXJuIGkucHVzaChyKSwhMH0pfSksYyhtYWtlRXJyb3IoInNjcmlwdGVycm9yIiwnU2NyaXB0IGVycm9yIGZvciAiJyt0LmlkKyhpLmxlbmd0aD8nIiwgbmVlZGVkIGJ5OiAnK2kuam9pbigiLCAiKTonIicpLGUsW3QuaWRdKSl9fX0scS5yZXF1aXJlPXEubWFrZVJlcXVpcmUoKSxxfWZ1bmN0aW9uIGdldEludGVyYWN0aXZlU2NyaXB0KCl7cmV0dXJuIGludGVyYWN0aXZlU2NyaXB0JiYiaW50ZXJhY3RpdmUiPT09aW50ZXJhY3RpdmVTY3JpcHQucmVhZHlTdGF0ZT9pbnRlcmFjdGl2ZVNjcmlwdDooZWFjaFJldmVyc2Uoc2NyaXB0cygpLGZ1bmN0aW9uKGUpe2lmKCJpbnRlcmFjdGl2ZSI9PT1lLnJlYWR5U3RhdGUpcmV0dXJuIGludGVyYWN0aXZlU2NyaXB0PWV9KSxpbnRlcmFjdGl2ZVNjcmlwdCl9dmFyIHJlcSxzLGhlYWQsYmFzZUVsZW1lbnQsZGF0YU1haW4sc3JjLGludGVyYWN0aXZlU2NyaXB0LGN1cnJlbnRseUFkZGluZ1NjcmlwdCxtYWluU2NyaXB0LHN1YlBhdGgsdmVyc2lvbj0iMi4zLjUiLGNvbW1lbnRSZWdFeHA9L1wvXCpbXHNcU10qP1wqXC98KFteOiInPV18XilcL1wvLiokL2dtLGNqc1JlcXVpcmVSZWdFeHA9L1teLl1ccypyZXF1aXJlXHMqXChccypbIiddKFteJyJcc10rKVsiJ11ccypcKS9nLGpzU3VmZml4UmVnRXhwPS9cLmpzJC8sY3VyckRpclJlZ0V4cD0vXlwuXC8vLG9wPU9iamVjdC5wcm90b3R5cGUsb3N0cmluZz1vcC50b1N0cmluZyxoYXNPd249b3AuaGFzT3duUHJvcGVydHksaXNCcm93c2VyPSEoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yfHwhd2luZG93LmRvY3VtZW50KSxpc1dlYldvcmtlcj0haXNCcm93c2VyJiYidW5kZWZpbmVkIiE9dHlwZW9mIGltcG9ydFNjcmlwdHMscmVhZHlSZWdFeHA9aXNCcm93c2VyJiYiUExBWVNUQVRJT04gMyI9PT1uYXZpZ2F0b3IucGxhdGZvcm0/L15jb21wbGV0ZSQvOi9eKGNvbXBsZXRlfGxvYWRlZCkkLyxkZWZDb250ZXh0TmFtZT0iXyIsaXNPcGVyYT0idW5kZWZpbmVkIiE9dHlwZW9mIG9wZXJhJiYiW29iamVjdCBPcGVyYV0iPT09b3BlcmEudG9TdHJpbmcoKSxjb250ZXh0cz17fSxjZmc9e30sZ2xvYmFsRGVmUXVldWU9W10sdXNlSW50ZXJhY3RpdmU9ITE7aWYodm9pZCAwPT09ZGVmaW5lKXtpZih2b2lkIDAhPT1yZXF1aXJlanMpe2lmKGlzRnVuY3Rpb24ocmVxdWlyZWpzKSlyZXR1cm47Y2ZnPXJlcXVpcmVqcyxyZXF1aXJlanM9dm9pZCAwfXZvaWQgMD09PXJlcXVpcmV8fGlzRnVuY3Rpb24ocmVxdWlyZSl8fChjZmc9cmVxdWlyZSxyZXF1aXJlPXZvaWQgMCkscmVxPXJlcXVpcmVqcz1mdW5jdGlvbihlLHQsaSxyKXt2YXIgbixvLGE9ZGVmQ29udGV4dE5hbWU7cmV0dXJuIGlzQXJyYXkoZSl8fCJzdHJpbmciPT10eXBlb2YgZXx8KG89ZSxpc0FycmF5KHQpPyhlPXQsdD1pLGk9cik6ZT1bXSksbyYmby5jb250ZXh0JiYoYT1vLmNvbnRleHQpLChuPWdldE93bihjb250ZXh0cyxhKSl8fChuPWNvbnRleHRzW2FdPXJlcS5zLm5ld0NvbnRleHQoYSkpLG8mJm4uY29uZmlndXJlKG8pLG4ucmVxdWlyZShlLHQsaSl9LHJlcS5jb25maWc9ZnVuY3Rpb24oZSl7cmV0dXJuIHJlcShlKX0scmVxLm5leHRUaWNrPXZvaWQgMCE9PXNldFRpbWVvdXQ/ZnVuY3Rpb24oZSl7c2V0VGltZW91dChlLDQpfTpmdW5jdGlvbihlKXtlKCl9LHJlcXVpcmV8fChyZXF1aXJlPXJlcSkscmVxLnZlcnNpb249dmVyc2lvbixyZXEuanNFeHRSZWdFeHA9L15cL3w6fFw/fFwuanMkLyxyZXEuaXNCcm93c2VyPWlzQnJvd3NlcixzPXJlcS5zPXtjb250ZXh0czpjb250ZXh0cyxuZXdDb250ZXh0Om5ld0NvbnRleHR9LHJlcSh7fSksZWFjaChbInRvVXJsIiwidW5kZWYiLCJkZWZpbmVkIiwic3BlY2lmaWVkIl0sZnVuY3Rpb24oZSl7cmVxW2VdPWZ1bmN0aW9uKCl7dmFyIHQ9Y29udGV4dHNbZGVmQ29udGV4dE5hbWVdO3JldHVybiB0LnJlcXVpcmVbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0pLGlzQnJvd3NlciYmKGhlYWQ9cy5oZWFkPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sKGJhc2VFbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIilbMF0pJiYoaGVhZD1zLmhlYWQ9YmFzZUVsZW1lbnQucGFyZW50Tm9kZSkpLHJlcS5vbkVycm9yPWRlZmF1bHRPbkVycm9yLHJlcS5jcmVhdGVOb2RlPWZ1bmN0aW9uKGUsdCxpKXt2YXIgcj1lLnhodG1sP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImh0bWw6c2NyaXB0Iik6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cmV0dXJuIHIudHlwZT1lLnNjcmlwdFR5cGV8fCJ0ZXh0L2phdmFzY3JpcHQiLHIuY2hhcnNldD0idXRmLTgiLHIuYXN5bmM9ITAscn0scmVxLmxvYWQ9ZnVuY3Rpb24oZSx0LGkpe3ZhciByLG49ZSYmZS5jb25maWd8fHt9O2lmKGlzQnJvd3NlcilyZXR1cm4ocj1yZXEuY3JlYXRlTm9kZShuLHQsaSkpLnNldEF0dHJpYnV0ZSgiZGF0YS1yZXF1aXJlY29udGV4dCIsZS5jb250ZXh0TmFtZSksci5zZXRBdHRyaWJ1dGUoImRhdGEtcmVxdWlyZW1vZHVsZSIsdCksIXIuYXR0YWNoRXZlbnR8fHIuYXR0YWNoRXZlbnQudG9TdHJpbmcmJnIuYXR0YWNoRXZlbnQudG9TdHJpbmcoKS5pbmRleE9mKCJbbmF0aXZlIGNvZGUiKTwwfHxpc09wZXJhPyhyLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUub25TY3JpcHRMb2FkLCExKSxyLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlLm9uU2NyaXB0RXJyb3IsITEpKToodXNlSW50ZXJhY3RpdmU9ITAsci5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixlLm9uU2NyaXB0TG9hZCkpLHIuc3JjPWksbi5vbk5vZGVDcmVhdGVkJiZuLm9uTm9kZUNyZWF0ZWQocixuLHQsaSksY3VycmVudGx5QWRkaW5nU2NyaXB0PXIsYmFzZUVsZW1lbnQ/aGVhZC5pbnNlcnRCZWZvcmUocixiYXNlRWxlbWVudCk6aGVhZC5hcHBlbmRDaGlsZChyKSxjdXJyZW50bHlBZGRpbmdTY3JpcHQ9bnVsbCxyO2lmKGlzV2ViV29ya2VyKXRyeXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwwKSxpbXBvcnRTY3JpcHRzKGkpLGUuY29tcGxldGVMb2FkKHQpfWNhdGNoKHIpe2Uub25FcnJvcihtYWtlRXJyb3IoImltcG9ydHNjcmlwdHMiLCJpbXBvcnRTY3JpcHRzIGZhaWxlZCBmb3IgIit0KyIgYXQgIitpLHIsW3RdKSl9fSxpc0Jyb3dzZXImJiFjZmcuc2tpcERhdGFNYWluJiZlYWNoUmV2ZXJzZShzY3JpcHRzKCksZnVuY3Rpb24oZSl7aWYoaGVhZHx8KGhlYWQ9ZS5wYXJlbnROb2RlKSxkYXRhTWFpbj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1tYWluIikpcmV0dXJuIG1haW5TY3JpcHQ9ZGF0YU1haW4sY2ZnLmJhc2VVcmx8fC0xIT09bWFpblNjcmlwdC5pbmRleE9mKCIhIil8fChzcmM9bWFpblNjcmlwdC5zcGxpdCgiLyIpLG1haW5TY3JpcHQ9c3JjLnBvcCgpLHN1YlBhdGg9c3JjLmxlbmd0aD9zcmMuam9pbigiLyIpKyIvIjoiLi8iLGNmZy5iYXNlVXJsPXN1YlBhdGgpLG1haW5TY3JpcHQ9bWFpblNjcmlwdC5yZXBsYWNlKGpzU3VmZml4UmVnRXhwLCIiKSxyZXEuanNFeHRSZWdFeHAudGVzdChtYWluU2NyaXB0KSYmKG1haW5TY3JpcHQ9ZGF0YU1haW4pLGNmZy5kZXBzPWNmZy5kZXBzP2NmZy5kZXBzLmNvbmNhdChtYWluU2NyaXB0KTpbbWFpblNjcmlwdF0sITB9KSxkZWZpbmU9ZnVuY3Rpb24oZSx0LGkpe3ZhciByLG47InN0cmluZyIhPXR5cGVvZiBlJiYoaT10LHQ9ZSxlPW51bGwpLGlzQXJyYXkodCl8fChpPXQsdD1udWxsKSwhdCYmaXNGdW5jdGlvbihpKSYmKHQ9W10saS5sZW5ndGgmJihpLnRvU3RyaW5nKCkucmVwbGFjZShjb21tZW50UmVnRXhwLGNvbW1lbnRSZXBsYWNlKS5yZXBsYWNlKGNqc1JlcXVpcmVSZWdFeHAsZnVuY3Rpb24oZSxpKXt0LnB1c2goaSl9KSx0PSgxPT09aS5sZW5ndGg/WyJyZXF1aXJlIl06WyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdKS5jb25jYXQodCkpKSx1c2VJbnRlcmFjdGl2ZSYmKHI9Y3VycmVudGx5QWRkaW5nU2NyaXB0fHxnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpKSYmKGV8fChlPXIuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVtb2R1bGUiKSksbj1jb250ZXh0c1tyLmdldEF0dHJpYnV0ZSgiZGF0YS1yZXF1aXJlY29udGV4dCIpXSksbj8obi5kZWZRdWV1ZS5wdXNoKFtlLHQsaV0pLG4uZGVmUXVldWVNYXBbZV09ITApOmdsb2JhbERlZlF1ZXVlLnB1c2goW2UsdCxpXSl9LGRlZmluZS5hbWQ9e2pRdWVyeTohMH0scmVxLmV4ZWM9ZnVuY3Rpb24odGV4dCl7cmV0dXJuIGV2YWwodGV4dCl9LHJlcShjZmcpfX0odGhpcywidW5kZWZpbmVkIj09dHlwZW9mIHNldFRpbWVvdXQ/dm9pZCAwOnNldFRpbWVvdXQp
Protocol
HTTP/1.1
Server
194.66.87.68 , United Kingdom, ASN786 (JANET Jisc Services Limited, GB),
Reverse DNS
campusmoodle.rgu.ac.uk
Software
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4 / PHP/7.1.4
Resource Hash
a3af78e67fbc6866690b74c4e4e0d79cc66cc20cf1d2c7dadf75ece406e5c1e1

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sun, 06 Sep 2020 09:31:39 GMT
Content-Encoding
gzip
X-Powered-By
PHP/7.1.4
Transfer-Encoding
chunked
Content-Disposition
inline; filename="requirejs.php"
Connection
Keep-Alive
Pragma
Last-Modified
Thu, 13 Aug 2020 20:32:42 GMT
Server
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4
Etag
"21e98ebe9c0adb14a62cd076951a4c94f9fbfe39"
Vary
Accept-Encoding
Content-Type
application/javascript; charset=utf-8
Cache-Control
public, max-age=7776000, immutable
Accept-Ranges
none
Keep-Alive
timeout=5, max=99
Expires
Sat, 05 Dec 2020 09:31:39 GMT
jquery-3.2.1.min.js
campusmoodle.rgu.ac.uk/lib/javascript.php/1591866501/lib/jquery/
85 KB
30 KB
Script
General
Full URL
http://campusmoodle.rgu.ac.uk/lib/javascript.php/1591866501/lib/jquery/jquery-3.2.1.min.js
Requested by
Host: application
URL: data:application/javascript;base64,dmFyIHJlcXVpcmVqcyxyZXF1aXJlLGRlZmluZTshZnVuY3Rpb24oZ2xvYmFsLHNldFRpbWVvdXQpe2Z1bmN0aW9uIGNvbW1lbnRSZXBsYWNlKGUsdCl7cmV0dXJuIHR8fCIifWZ1bmN0aW9uIGlzRnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09PW9zdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBpc0FycmF5KGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1vc3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gZWFjaChlLHQpe2lmKGUpe3ZhciBpO2ZvcihpPTA7aTxlLmxlbmd0aCYmKCFlW2ldfHwhdChlW2ldLGksZSkpO2krPTEpO319ZnVuY3Rpb24gZWFjaFJldmVyc2UoZSx0KXtpZihlKXt2YXIgaTtmb3IoaT1lLmxlbmd0aC0xO2k+LTEmJighZVtpXXx8IXQoZVtpXSxpLGUpKTtpLT0xKTt9fWZ1bmN0aW9uIGhhc1Byb3AoZSx0KXtyZXR1cm4gaGFzT3duLmNhbGwoZSx0KX1mdW5jdGlvbiBnZXRPd24oZSx0KXtyZXR1cm4gaGFzUHJvcChlLHQpJiZlW3RdfWZ1bmN0aW9uIGVhY2hQcm9wKGUsdCl7dmFyIGk7Zm9yKGkgaW4gZSlpZihoYXNQcm9wKGUsaSkmJnQoZVtpXSxpKSlicmVha31mdW5jdGlvbiBtaXhpbihlLHQsaSxyKXtyZXR1cm4gdCYmZWFjaFByb3AodCxmdW5jdGlvbih0LG4peyFpJiZoYXNQcm9wKGUsbil8fCghcnx8Im9iamVjdCIhPXR5cGVvZiB0fHwhdHx8aXNBcnJheSh0KXx8aXNGdW5jdGlvbih0KXx8dCBpbnN0YW5jZW9mIFJlZ0V4cD9lW25dPXQ6KGVbbl18fChlW25dPXt9KSxtaXhpbihlW25dLHQsaSxyKSkpfSksZX1mdW5jdGlvbiBiaW5kKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX1mdW5jdGlvbiBzY3JpcHRzKCl7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKX1mdW5jdGlvbiBkZWZhdWx0T25FcnJvcihlKXt0aHJvdyBlfWZ1bmN0aW9uIGdldEdsb2JhbChlKXtpZighZSlyZXR1cm4gZTt2YXIgdD1nbG9iYWw7cmV0dXJuIGVhY2goZS5zcGxpdCgiLiIpLGZ1bmN0aW9uKGUpe3Q9dFtlXX0pLHR9ZnVuY3Rpb24gbWFrZUVycm9yKGUsdCxpLHIpe3ZhciBuPW5ldyBFcnJvcih0KyJcbmh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjIitlKTtyZXR1cm4gbi5yZXF1aXJlVHlwZT1lLG4ucmVxdWlyZU1vZHVsZXM9cixpJiYobi5vcmlnaW5hbEVycm9yPWkpLG59ZnVuY3Rpb24gbmV3Q29udGV4dChlKXtmdW5jdGlvbiB0KGUpe3ZhciB0LGk7Zm9yKHQ9MDt0PGUubGVuZ3RoO3QrKylpZigiLiI9PT0oaT1lW3RdKSllLnNwbGljZSh0LDEpLHQtPTE7ZWxzZSBpZigiLi4iPT09aSl7aWYoMD09PXR8fDE9PT10JiYiLi4iPT09ZVsyXXx8Ii4uIj09PWVbdC0xXSljb250aW51ZTt0PjAmJihlLnNwbGljZSh0LTEsMiksdC09Mil9fWZ1bmN0aW9uIGkoZSxpLHIpe3ZhciBuLG8sYSxzLHUsYyxkLHAsZixsLGg9aSYmaS5zcGxpdCgiLyIpLG09eS5tYXAsZz1tJiZtWyIqIl07aWYoZSYmKGM9KGU9ZS5zcGxpdCgiLyIpKS5sZW5ndGgtMSx5Lm5vZGVJZENvbXBhdCYmanNTdWZmaXhSZWdFeHAudGVzdChlW2NdKSYmKGVbY109ZVtjXS5yZXBsYWNlKGpzU3VmZml4UmVnRXhwLCIiKSksIi4iPT09ZVswXS5jaGFyQXQoMCkmJmgmJihlPWguc2xpY2UoMCxoLmxlbmd0aC0xKS5jb25jYXQoZSkpLHQoZSksZT1lLmpvaW4oIi8iKSksciYmbSYmKGh8fGcpKXtlOmZvcihhPShvPWUuc3BsaXQoIi8iKSkubGVuZ3RoO2E+MDthLT0xKXtpZih1PW8uc2xpY2UoMCxhKS5qb2luKCIvIiksaClmb3Iocz1oLmxlbmd0aDtzPjA7cy09MSlpZigobj1nZXRPd24obSxoLnNsaWNlKDAscykuam9pbigiLyIpKSkmJihuPWdldE93bihuLHUpKSl7ZD1uLHA9YTticmVhayBlfSFmJiZnJiZnZXRPd24oZyx1KSYmKGY9Z2V0T3duKGcsdSksbD1hKX0hZCYmZiYmKGQ9ZixwPWwpLGQmJihvLnNwbGljZSgwLHAsZCksZT1vLmpvaW4oIi8iKSl9cmV0dXJuIGdldE93bih5LnBrZ3MsZSl8fGV9ZnVuY3Rpb24gcihlKXtpc0Jyb3dzZXImJmVhY2goc2NyaXB0cygpLGZ1bmN0aW9uKHQpe2lmKHQuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVtb2R1bGUiKT09PWUmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVjb250ZXh0Iik9PT1xLmNvbnRleHROYW1lKXJldHVybiB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksITB9KX1mdW5jdGlvbiBuKGUpe3ZhciB0PWdldE93bih5LnBhdGhzLGUpO2lmKHQmJmlzQXJyYXkodCkmJnQubGVuZ3RoPjEpcmV0dXJuIHQuc2hpZnQoKSxxLnJlcXVpcmUudW5kZWYoZSkscS5tYWtlUmVxdWlyZShudWxsLHtza2lwTWFwOiEwfSkoW2VdKSwhMH1mdW5jdGlvbiBvKGUpe3ZhciB0LGk9ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gaT4tMSYmKHQ9ZS5zdWJzdHJpbmcoMCxpKSxlPWUuc3Vic3RyaW5nKGkrMSxlLmxlbmd0aCkpLFt0LGVdfWZ1bmN0aW9uIGEoZSx0LHIsbil7dmFyIGEscyx1LGMsZD1udWxsLHA9dD90Lm5hbWU6bnVsbCxmPWUsbD0hMCxoPSIiO3JldHVybiBlfHwobD0hMSxlPSJfQHIiKyhUKz0xKSksYz1vKGUpLGQ9Y1swXSxlPWNbMV0sZCYmKGQ9aShkLHAsbikscz1nZXRPd24oaixkKSksZSYmKGQ/aD1yP2U6cyYmcy5ub3JtYWxpemU/cy5ub3JtYWxpemUoZSxmdW5jdGlvbihlKXtyZXR1cm4gaShlLHAsbil9KTotMT09PWUuaW5kZXhPZigiISIpP2koZSxwLG4pOmU6KGQ9KGM9byhoPWkoZSxwLG4pKSlbMF0saD1jWzFdLHI9ITAsYT1xLm5hbWVUb1VybChoKSkpLHU9IWR8fHN8fHI/IiI6Il91bm5vcm1hbGl6ZWQiKyhBKz0xKSx7cHJlZml4OmQsbmFtZTpoLHBhcmVudE1hcDp0LHVubm9ybWFsaXplZDohIXUsdXJsOmEsb3JpZ2luYWxOYW1lOmYsaXNEZWZpbmU6bCxpZDooZD9kKyIhIitoOmgpK3V9fWZ1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5pZCxpPWdldE93bihTLHQpO3JldHVybiBpfHwoaT1TW3RdPW5ldyBxLk1vZHVsZShlKSksaX1mdW5jdGlvbiB1KGUsdCxpKXt2YXIgcj1lLmlkLG49Z2V0T3duKFMscik7IWhhc1Byb3AoaixyKXx8biYmIW4uZGVmaW5lRW1pdENvbXBsZXRlPyhuPXMoZSkpLmVycm9yJiYiZXJyb3IiPT09dD9pKG4uZXJyb3IpOm4ub24odCxpKToiZGVmaW5lZCI9PT10JiZpKGpbcl0pfWZ1bmN0aW9uIGMoZSx0KXt2YXIgaT1lLnJlcXVpcmVNb2R1bGVzLHI9ITE7dD90KGUpOihlYWNoKGksZnVuY3Rpb24odCl7dmFyIGk9Z2V0T3duKFMsdCk7aSYmKGkuZXJyb3I9ZSxpLmV2ZW50cy5lcnJvciYmKHI9ITAsaS5lbWl0KCJlcnJvciIsZSkpKX0pLHJ8fHJlcS5vbkVycm9yKGUpKX1mdW5jdGlvbiBkKCl7Z2xvYmFsRGVmUXVldWUubGVuZ3RoJiYoZWFjaChnbG9iYWxEZWZRdWV1ZSxmdW5jdGlvbihlKXt2YXIgdD1lWzBdOyJzdHJpbmciPT10eXBlb2YgdCYmKHEuZGVmUXVldWVNYXBbdF09ITApLE8ucHVzaChlKX0pLGdsb2JhbERlZlF1ZXVlPVtdKX1mdW5jdGlvbiBwKGUpe2RlbGV0ZSBTW2VdLGRlbGV0ZSBrW2VdfWZ1bmN0aW9uIGYoZSx0LGkpe3ZhciByPWUubWFwLmlkO2UuZXJyb3I/ZS5lbWl0KCJlcnJvciIsZS5lcnJvcik6KHRbcl09ITAsZWFjaChlLmRlcE1hcHMsZnVuY3Rpb24ocixuKXt2YXIgbz1yLmlkLGE9Z2V0T3duKFMsbyk7IWF8fGUuZGVwTWF0Y2hlZFtuXXx8aVtvXXx8KGdldE93bih0LG8pPyhlLmRlZmluZURlcChuLGpbb10pLGUuY2hlY2soKSk6ZihhLHQsaSkpfSksaVtyXT0hMCl9ZnVuY3Rpb24gbCgpe3ZhciBlLHQsaT0xZTMqeS53YWl0U2Vjb25kcyxvPWkmJnEuc3RhcnRUaW1lK2k8KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1bXSxzPVtdLHU9ITEsZD0hMDtpZigheCl7aWYoeD0hMCxlYWNoUHJvcChrLGZ1bmN0aW9uKGUpe3ZhciBpPWUubWFwLGM9aS5pZDtpZihlLmVuYWJsZWQmJihpLmlzRGVmaW5lfHxzLnB1c2goZSksIWUuZXJyb3IpKWlmKCFlLmluaXRlZCYmbyluKGMpPyh0PSEwLHU9ITApOihhLnB1c2goYykscihjKSk7ZWxzZSBpZighZS5pbml0ZWQmJmUuZmV0Y2hlZCYmaS5pc0RlZmluZSYmKHU9ITAsIWkucHJlZml4KSlyZXR1cm4gZD0hMX0pLG8mJmEubGVuZ3RoKXJldHVybiBlPW1ha2VFcnJvcigidGltZW91dCIsIkxvYWQgdGltZW91dCBmb3IgbW9kdWxlczogIithLG51bGwsYSksZS5jb250ZXh0TmFtZT1xLmNvbnRleHROYW1lLGMoZSk7ZCYmZWFjaChzLGZ1bmN0aW9uKGUpe2YoZSx7fSx7fSl9KSxvJiYhdHx8IXV8fCFpc0Jyb3dzZXImJiFpc1dlYldvcmtlcnx8d3x8KHc9c2V0VGltZW91dChmdW5jdGlvbigpe3c9MCxsKCl9LDUwKSkseD0hMX19ZnVuY3Rpb24gaChlKXtoYXNQcm9wKGosZVswXSl8fHMoYShlWzBdLG51bGwsITApKS5pbml0KGVbMV0sZVsyXSl9ZnVuY3Rpb24gbShlLHQsaSxyKXtlLmRldGFjaEV2ZW50JiYhaXNPcGVyYT9yJiZlLmRldGFjaEV2ZW50KHIsdCk6ZS5yZW1vdmVFdmVudExpc3RlbmVyKGksdCwhMSl9ZnVuY3Rpb24gZyhlKXt2YXIgdD1lLmN1cnJlbnRUYXJnZXR8fGUuc3JjRWxlbWVudDtyZXR1cm4gbSh0LHEub25TY3JpcHRMb2FkLCJsb2FkIiwib25yZWFkeXN0YXRlY2hhbmdlIiksbSh0LHEub25TY3JpcHRFcnJvciwiZXJyb3IiKSx7bm9kZTp0LGlkOnQmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVtb2R1bGUiKX19ZnVuY3Rpb24gdigpe3ZhciBlO2ZvcihkKCk7Ty5sZW5ndGg7KXtpZihudWxsPT09KGU9Ty5zaGlmdCgpKVswXSlyZXR1cm4gYyhtYWtlRXJyb3IoIm1pc21hdGNoIiwiTWlzbWF0Y2hlZCBhbm9ueW1vdXMgZGVmaW5lKCkgbW9kdWxlOiAiK2VbZS5sZW5ndGgtMV0pKTtoKGUpfXEuZGVmUXVldWVNYXA9e319dmFyIHgsYixxLEUsdyx5PXt3YWl0U2Vjb25kczo3LGJhc2VVcmw6Ii4vIixwYXRoczp7fSxidW5kbGVzOnt9LHBrZ3M6e30sc2hpbTp7fSxjb25maWc6e319LFM9e30saz17fSxNPXt9LE89W10saj17fSxQPXt9LFI9e30sVD0xLEE9MTtyZXR1cm4gRT17cmVxdWlyZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXF1aXJlP2UucmVxdWlyZTplLnJlcXVpcmU9cS5tYWtlUmVxdWlyZShlLm1hcCl9LGV4cG9ydHM6ZnVuY3Rpb24oZSl7aWYoZS51c2luZ0V4cG9ydHM9ITAsZS5tYXAuaXNEZWZpbmUpcmV0dXJuIGUuZXhwb3J0cz9qW2UubWFwLmlkXT1lLmV4cG9ydHM6ZS5leHBvcnRzPWpbZS5tYXAuaWRdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubW9kdWxlP2UubW9kdWxlOmUubW9kdWxlPXtpZDplLm1hcC5pZCx1cmk6ZS5tYXAudXJsLGNvbmZpZzpmdW5jdGlvbigpe3JldHVybiBnZXRPd24oeS5jb25maWcsZS5tYXAuaWQpfHx7fX0sZXhwb3J0czplLmV4cG9ydHN8fChlLmV4cG9ydHM9e30pfX19LGI9ZnVuY3Rpb24oZSl7dGhpcy5ldmVudHM9Z2V0T3duKE0sZS5pZCl8fHt9LHRoaXMubWFwPWUsdGhpcy5zaGltPWdldE93bih5LnNoaW0sZS5pZCksdGhpcy5kZXBFeHBvcnRzPVtdLHRoaXMuZGVwTWFwcz1bXSx0aGlzLmRlcE1hdGNoZWQ9W10sdGhpcy5wbHVnaW5NYXBzPXt9LHRoaXMuZGVwQ291bnQ9MH0sYi5wcm90b3R5cGU9e2luaXQ6ZnVuY3Rpb24oZSx0LGkscil7cj1yfHx7fSx0aGlzLmluaXRlZHx8KHRoaXMuZmFjdG9yeT10LGk/dGhpcy5vbigiZXJyb3IiLGkpOnRoaXMuZXZlbnRzLmVycm9yJiYoaT1iaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5lbWl0KCJlcnJvciIsZSl9KSksdGhpcy5kZXBNYXBzPWUmJmUuc2xpY2UoMCksdGhpcy5lcnJiYWNrPWksdGhpcy5pbml0ZWQ9ITAsdGhpcy5pZ25vcmU9ci5pZ25vcmUsci5lbmFibGVkfHx0aGlzLmVuYWJsZWQ/dGhpcy5lbmFibGUoKTp0aGlzLmNoZWNrKCkpfSxkZWZpbmVEZXA6ZnVuY3Rpb24oZSx0KXt0aGlzLmRlcE1hdGNoZWRbZV18fCh0aGlzLmRlcE1hdGNoZWRbZV09ITAsdGhpcy5kZXBDb3VudC09MSx0aGlzLmRlcEV4cG9ydHNbZV09dCl9LGZldGNoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmV0Y2hlZCl7dGhpcy5mZXRjaGVkPSEwLHEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3ZhciBlPXRoaXMubWFwO2lmKCF0aGlzLnNoaW0pcmV0dXJuIGUucHJlZml4P3RoaXMuY2FsbFBsdWdpbigpOnRoaXMubG9hZCgpO3EubWFrZVJlcXVpcmUodGhpcy5tYXAse2VuYWJsZUJ1aWxkQ2FsbGJhY2s6ITB9KSh0aGlzLnNoaW0uZGVwc3x8W10sYmluZCh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGUucHJlZml4P3RoaXMuY2FsbFBsdWdpbigpOnRoaXMubG9hZCgpfSkpfX0sbG9hZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMubWFwLnVybDtQW2VdfHwoUFtlXT0hMCxxLmxvYWQodGhpcy5tYXAuaWQsZSkpfSxjaGVjazpmdW5jdGlvbigpe2lmKHRoaXMuZW5hYmxlZCYmIXRoaXMuZW5hYmxpbmcpe3ZhciBlLHQsaT10aGlzLm1hcC5pZCxyPXRoaXMuZGVwRXhwb3J0cyxuPXRoaXMuZXhwb3J0cyxvPXRoaXMuZmFjdG9yeTtpZih0aGlzLmluaXRlZCl7aWYodGhpcy5lcnJvcil0aGlzLmVtaXQoImVycm9yIix0aGlzLmVycm9yKTtlbHNlIGlmKCF0aGlzLmRlZmluaW5nKXtpZih0aGlzLmRlZmluaW5nPSEwLHRoaXMuZGVwQ291bnQ8MSYmIXRoaXMuZGVmaW5lZCl7aWYoaXNGdW5jdGlvbihvKSl7aWYodGhpcy5ldmVudHMuZXJyb3ImJnRoaXMubWFwLmlzRGVmaW5lfHxyZXEub25FcnJvciE9PWRlZmF1bHRPbkVycm9yKXRyeXtuPXEuZXhlY0NiKGksbyxyLG4pfWNhdGNoKHQpe2U9dH1lbHNlIG49cS5leGVjQ2IoaSxvLHIsbik7aWYodGhpcy5tYXAuaXNEZWZpbmUmJnZvaWQgMD09PW4mJigodD10aGlzLm1vZHVsZSk/bj10LmV4cG9ydHM6dGhpcy51c2luZ0V4cG9ydHMmJihuPXRoaXMuZXhwb3J0cykpLGUpcmV0dXJuIGUucmVxdWlyZU1hcD10aGlzLm1hcCxlLnJlcXVpcmVNb2R1bGVzPXRoaXMubWFwLmlzRGVmaW5lP1t0aGlzLm1hcC5pZF06bnVsbCxlLnJlcXVpcmVUeXBlPXRoaXMubWFwLmlzRGVmaW5lPyJkZWZpbmUiOiJyZXF1aXJlIixjKHRoaXMuZXJyb3I9ZSl9ZWxzZSBuPW87aWYodGhpcy5leHBvcnRzPW4sdGhpcy5tYXAuaXNEZWZpbmUmJiF0aGlzLmlnbm9yZSYmKGpbaV09bixyZXEub25SZXNvdXJjZUxvYWQpKXt2YXIgYT1bXTtlYWNoKHRoaXMuZGVwTWFwcyxmdW5jdGlvbihlKXthLnB1c2goZS5ub3JtYWxpemVkTWFwfHxlKX0pLHJlcS5vblJlc291cmNlTG9hZChxLHRoaXMubWFwLGEpfXAoaSksdGhpcy5kZWZpbmVkPSEwfXRoaXMuZGVmaW5pbmc9ITEsdGhpcy5kZWZpbmVkJiYhdGhpcy5kZWZpbmVFbWl0dGVkJiYodGhpcy5kZWZpbmVFbWl0dGVkPSEwLHRoaXMuZW1pdCgiZGVmaW5lZCIsdGhpcy5leHBvcnRzKSx0aGlzLmRlZmluZUVtaXRDb21wbGV0ZT0hMCl9fWVsc2UgaGFzUHJvcChxLmRlZlF1ZXVlTWFwLGkpfHx0aGlzLmZldGNoKCl9fSxjYWxsUGx1Z2luOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tYXAsdD1lLmlkLHI9YShlLnByZWZpeCk7dGhpcy5kZXBNYXBzLnB1c2gociksdShyLCJkZWZpbmVkIixiaW5kKHRoaXMsZnVuY3Rpb24ocil7dmFyIG4sbyxkLGY9Z2V0T3duKFIsdGhpcy5tYXAuaWQpLGw9dGhpcy5tYXAubmFtZSxoPXRoaXMubWFwLnBhcmVudE1hcD90aGlzLm1hcC5wYXJlbnRNYXAubmFtZTpudWxsLG09cS5tYWtlUmVxdWlyZShlLnBhcmVudE1hcCx7ZW5hYmxlQnVpbGRDYWxsYmFjazohMH0pO3JldHVybiB0aGlzLm1hcC51bm5vcm1hbGl6ZWQ/KHIubm9ybWFsaXplJiYobD1yLm5vcm1hbGl6ZShsLGZ1bmN0aW9uKGUpe3JldHVybiBpKGUsaCwhMCl9KXx8IiIpLG89YShlLnByZWZpeCsiISIrbCx0aGlzLm1hcC5wYXJlbnRNYXAsITApLHUobywiZGVmaW5lZCIsYmluZCh0aGlzLGZ1bmN0aW9uKGUpe3RoaXMubWFwLm5vcm1hbGl6ZWRNYXA9byx0aGlzLmluaXQoW10sZnVuY3Rpb24oKXtyZXR1cm4gZX0sbnVsbCx7ZW5hYmxlZDohMCxpZ25vcmU6ITB9KX0pKSx2b2lkKChkPWdldE93bihTLG8uaWQpKSYmKHRoaXMuZGVwTWFwcy5wdXNoKG8pLHRoaXMuZXZlbnRzLmVycm9yJiZkLm9uKCJlcnJvciIsYmluZCh0aGlzLGZ1bmN0aW9uKGUpe3RoaXMuZW1pdCgiZXJyb3IiLGUpfSkpLGQuZW5hYmxlKCkpKSk6Zj8odGhpcy5tYXAudXJsPXEubmFtZVRvVXJsKGYpLHZvaWQgdGhpcy5sb2FkKCkpOigobj1iaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5pbml0KFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGV9LG51bGwse2VuYWJsZWQ6ITB9KX0pKS5lcnJvcj1iaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5pbml0ZWQ9ITAsdGhpcy5lcnJvcj1lLGUucmVxdWlyZU1vZHVsZXM9W3RdLGVhY2hQcm9wKFMsZnVuY3Rpb24oZSl7MD09PWUubWFwLmlkLmluZGV4T2YodCsiX3Vubm9ybWFsaXplZCIpJiZwKGUubWFwLmlkKX0pLGMoZSl9KSxuLmZyb21UZXh0PWJpbmQodGhpcyxmdW5jdGlvbihpLHIpe3ZhciBvPWUubmFtZSx1PWEobyksZD11c2VJbnRlcmFjdGl2ZTtyJiYoaT1yKSxkJiYodXNlSW50ZXJhY3RpdmU9ITEpLHModSksaGFzUHJvcCh5LmNvbmZpZyx0KSYmKHkuY29uZmlnW29dPXkuY29uZmlnW3RdKTt0cnl7cmVxLmV4ZWMoaSl9Y2F0Y2goZSl7cmV0dXJuIGMobWFrZUVycm9yKCJmcm9tdGV4dGV2YWwiLCJmcm9tVGV4dCBldmFsIGZvciAiK3QrIiBmYWlsZWQ6ICIrZSxlLFt0XSkpfWQmJih1c2VJbnRlcmFjdGl2ZT0hMCksdGhpcy5kZXBNYXBzLnB1c2godSkscS5jb21wbGV0ZUxvYWQobyksbShbb10sbil9KSx2b2lkIHIubG9hZChlLm5hbWUsbSxuLHkpKX0pKSxxLmVuYWJsZShyLHRoaXMpLHRoaXMucGx1Z2luTWFwc1tyLmlkXT1yfSxlbmFibGU6ZnVuY3Rpb24oKXtrW3RoaXMubWFwLmlkXT10aGlzLHRoaXMuZW5hYmxlZD0hMCx0aGlzLmVuYWJsaW5nPSEwLGVhY2godGhpcy5kZXBNYXBzLGJpbmQodGhpcyxmdW5jdGlvbihlLHQpe3ZhciBpLHIsbjtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKGU9YShlLHRoaXMubWFwLmlzRGVmaW5lP3RoaXMubWFwOnRoaXMubWFwLnBhcmVudE1hcCwhMSwhdGhpcy5za2lwTWFwKSx0aGlzLmRlcE1hcHNbdF09ZSxuPWdldE93bihFLGUuaWQpKXJldHVybiB2b2lkKHRoaXMuZGVwRXhwb3J0c1t0XT1uKHRoaXMpKTt0aGlzLmRlcENvdW50Kz0xLHUoZSwiZGVmaW5lZCIsYmluZCh0aGlzLGZ1bmN0aW9uKGUpe3RoaXMudW5kZWZlZHx8KHRoaXMuZGVmaW5lRGVwKHQsZSksdGhpcy5jaGVjaygpKX0pKSx0aGlzLmVycmJhY2s/dShlLCJlcnJvciIsYmluZCh0aGlzLHRoaXMuZXJyYmFjaykpOnRoaXMuZXZlbnRzLmVycm9yJiZ1KGUsImVycm9yIixiaW5kKHRoaXMsZnVuY3Rpb24oZSl7dGhpcy5lbWl0KCJlcnJvciIsZSl9KSl9aT1lLmlkLHI9U1tpXSxoYXNQcm9wKEUsaSl8fCFyfHxyLmVuYWJsZWR8fHEuZW5hYmxlKGUsdGhpcyl9KSksZWFjaFByb3AodGhpcy5wbHVnaW5NYXBzLGJpbmQodGhpcyxmdW5jdGlvbihlKXt2YXIgdD1nZXRPd24oUyxlLmlkKTt0JiYhdC5lbmFibGVkJiZxLmVuYWJsZShlLHRoaXMpfSkpLHRoaXMuZW5hYmxpbmc9ITEsdGhpcy5jaGVjaygpfSxvbjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuZXZlbnRzW2VdO2l8fChpPXRoaXMuZXZlbnRzW2VdPVtdKSxpLnB1c2godCl9LGVtaXQ6ZnVuY3Rpb24oZSx0KXtlYWNoKHRoaXMuZXZlbnRzW2VdLGZ1bmN0aW9uKGUpe2UodCl9KSwiZXJyb3IiPT09ZSYmZGVsZXRlIHRoaXMuZXZlbnRzW2VdfX0scT17Y29uZmlnOnksY29udGV4dE5hbWU6ZSxyZWdpc3RyeTpTLGRlZmluZWQ6aix1cmxGZXRjaGVkOlAsZGVmUXVldWU6TyxkZWZRdWV1ZU1hcDp7fSxNb2R1bGU6YixtYWtlTW9kdWxlTWFwOmEsbmV4dFRpY2s6cmVxLm5leHRUaWNrLG9uRXJyb3I6Yyxjb25maWd1cmU6ZnVuY3Rpb24oZSl7aWYoZS5iYXNlVXJsJiYiLyIhPT1lLmJhc2VVcmwuY2hhckF0KGUuYmFzZVVybC5sZW5ndGgtMSkmJihlLmJhc2VVcmwrPSIvIiksInN0cmluZyI9PXR5cGVvZiBlLnVybEFyZ3Mpe3ZhciB0PWUudXJsQXJncztlLnVybEFyZ3M9ZnVuY3Rpb24oZSxpKXtyZXR1cm4oLTE9PT1pLmluZGV4T2YoIj8iKT8iPyI6IiYiKSt0fX12YXIgaT15LnNoaW0scj17cGF0aHM6ITAsYnVuZGxlczohMCxjb25maWc6ITAsbWFwOiEwfTtlYWNoUHJvcChlLGZ1bmN0aW9uKGUsdCl7clt0XT8oeVt0XXx8KHlbdF09e30pLG1peGluKHlbdF0sZSwhMCwhMCkpOnlbdF09ZX0pLGUuYnVuZGxlcyYmZWFjaFByb3AoZS5idW5kbGVzLGZ1bmN0aW9uKGUsdCl7ZWFjaChlLGZ1bmN0aW9uKGUpe2UhPT10JiYoUltlXT10KX0pfSksZS5zaGltJiYoZWFjaFByb3AoZS5zaGltLGZ1bmN0aW9uKGUsdCl7aXNBcnJheShlKSYmKGU9e2RlcHM6ZX0pLCFlLmV4cG9ydHMmJiFlLmluaXR8fGUuZXhwb3J0c0ZufHwoZS5leHBvcnRzRm49cS5tYWtlU2hpbUV4cG9ydHMoZSkpLGlbdF09ZX0pLHkuc2hpbT1pKSxlLnBhY2thZ2VzJiZlYWNoKGUucGFja2FnZXMsZnVuY3Rpb24oZSl7dmFyIHQ7dD0oZT0ic3RyaW5nIj09dHlwZW9mIGU/e25hbWU6ZX06ZSkubmFtZSxlLmxvY2F0aW9uJiYoeS5wYXRoc1t0XT1lLmxvY2F0aW9uKSx5LnBrZ3NbdF09ZS5uYW1lKyIvIisoZS5tYWlufHwibWFpbiIpLnJlcGxhY2UoY3VyckRpclJlZ0V4cCwiIikucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwiIil9KSxlYWNoUHJvcChTLGZ1bmN0aW9uKGUsdCl7ZS5pbml0ZWR8fGUubWFwLnVubm9ybWFsaXplZHx8KGUubWFwPWEodCxudWxsLCEwKSl9KSwoZS5kZXBzfHxlLmNhbGxiYWNrKSYmcS5yZXF1aXJlKGUuZGVwc3x8W10sZS5jYWxsYmFjayl9LG1ha2VTaGltRXhwb3J0czpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gZS5pbml0JiYodD1lLmluaXQuYXBwbHkoZ2xvYmFsLGFyZ3VtZW50cykpLHR8fGUuZXhwb3J0cyYmZ2V0R2xvYmFsKGUuZXhwb3J0cyl9fSxtYWtlUmVxdWlyZTpmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIG8oaSxyLHUpe3ZhciBkLHAsZjtyZXR1cm4gbi5lbmFibGVCdWlsZENhbGxiYWNrJiZyJiZpc0Z1bmN0aW9uKHIpJiYoci5fX3JlcXVpcmVKc0J1aWxkPSEwKSwic3RyaW5nIj09dHlwZW9mIGk/aXNGdW5jdGlvbihyKT9jKG1ha2VFcnJvcigicmVxdWlyZWFyZ3MiLCJJbnZhbGlkIHJlcXVpcmUgY2FsbCIpLHUpOnQmJmhhc1Byb3AoRSxpKT9FW2ldKFNbdC5pZF0pOnJlcS5nZXQ/cmVxLmdldChxLGksdCxvKToocD1hKGksdCwhMSwhMCksZD1wLmlkLGhhc1Byb3AoaixkKT9qW2RdOmMobWFrZUVycm9yKCJub3Rsb2FkZWQiLCdNb2R1bGUgbmFtZSAiJytkKyciIGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0IGZvciBjb250ZXh0OiAnK2UrKHQ/IiI6Ii4gVXNlIHJlcXVpcmUoW10pIikpKSk6KHYoKSxxLm5leHRUaWNrKGZ1bmN0aW9uKCl7digpLChmPXMoYShudWxsLHQpKSkuc2tpcE1hcD1uLnNraXBNYXAsZi5pbml0KGkscix1LHtlbmFibGVkOiEwfSksbCgpfSksbyl9cmV0dXJuIG49bnx8e30sbWl4aW4obyx7aXNCcm93c2VyOmlzQnJvd3Nlcix0b1VybDpmdW5jdGlvbihlKXt2YXIgcixuPWUubGFzdEluZGV4T2YoIi4iKSxvPWUuc3BsaXQoIi8iKVswXSxhPSIuIj09PW98fCIuLiI9PT1vO3JldHVybi0xIT09biYmKCFhfHxuPjEpJiYocj1lLnN1YnN0cmluZyhuLGUubGVuZ3RoKSxlPWUuc3Vic3RyaW5nKDAsbikpLHEubmFtZVRvVXJsKGkoZSx0JiZ0LmlkLCEwKSxyLCEwKX0sZGVmaW5lZDpmdW5jdGlvbihlKXtyZXR1cm4gaGFzUHJvcChqLGEoZSx0LCExLCEwKS5pZCl9LHNwZWNpZmllZDpmdW5jdGlvbihlKXtyZXR1cm4gZT1hKGUsdCwhMSwhMCkuaWQsaGFzUHJvcChqLGUpfHxoYXNQcm9wKFMsZSl9fSksdHx8KG8udW5kZWY9ZnVuY3Rpb24oZSl7ZCgpO3ZhciBpPWEoZSx0LCEwKSxuPWdldE93bihTLGUpO24udW5kZWZlZD0hMCxyKGUpLGRlbGV0ZSBqW2VdLGRlbGV0ZSBQW2kudXJsXSxkZWxldGUgTVtlXSxlYWNoUmV2ZXJzZShPLGZ1bmN0aW9uKHQsaSl7dFswXT09PWUmJk8uc3BsaWNlKGksMSl9KSxkZWxldGUgcS5kZWZRdWV1ZU1hcFtlXSxuJiYobi5ldmVudHMuZGVmaW5lZCYmKE1bZV09bi5ldmVudHMpLHAoZSkpfSksb30sZW5hYmxlOmZ1bmN0aW9uKGUpe2dldE93bihTLGUuaWQpJiZzKGUpLmVuYWJsZSgpfSxjb21wbGV0ZUxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQsaSxyLG89Z2V0T3duKHkuc2hpbSxlKXx8e30sYT1vLmV4cG9ydHM7Zm9yKGQoKTtPLmxlbmd0aDspe2lmKG51bGw9PT0oaT1PLnNoaWZ0KCkpWzBdKXtpZihpWzBdPWUsdClicmVhazt0PSEwfWVsc2UgaVswXT09PWUmJih0PSEwKTtoKGkpfWlmKHEuZGVmUXVldWVNYXA9e30scj1nZXRPd24oUyxlKSwhdCYmIWhhc1Byb3AoaixlKSYmciYmIXIuaW5pdGVkKXtpZighKCF5LmVuZm9yY2VEZWZpbmV8fGEmJmdldEdsb2JhbChhKSkpcmV0dXJuIG4oZSk/dm9pZCAwOmMobWFrZUVycm9yKCJub2RlZmluZSIsIk5vIGRlZmluZSBjYWxsIGZvciAiK2UsbnVsbCxbZV0pKTtoKFtlLG8uZGVwc3x8W10sby5leHBvcnRzRm5dKX1sKCl9LG5hbWVUb1VybDpmdW5jdGlvbihlLHQsaSl7dmFyIHIsbixvLGEscyx1LGMsZD1nZXRPd24oeS5wa2dzLGUpO2lmKGQmJihlPWQpLGM9Z2V0T3duKFIsZSkpcmV0dXJuIHEubmFtZVRvVXJsKGMsdCxpKTtpZihyZXEuanNFeHRSZWdFeHAudGVzdChlKSlzPWUrKHR8fCIiKTtlbHNle2ZvcihyPXkucGF0aHMsbz0obj1lLnNwbGl0KCIvIikpLmxlbmd0aDtvPjA7by09MSlpZihhPW4uc2xpY2UoMCxvKS5qb2luKCIvIiksdT1nZXRPd24ocixhKSl7aXNBcnJheSh1KSYmKHU9dVswXSksbi5zcGxpY2UoMCxvLHUpO2JyZWFrfXM9bi5qb2luKCIvIikscz0oIi8iPT09KHMrPXR8fCgvXmRhdGFcOnxeYmxvYlw6fFw/Ly50ZXN0KHMpfHxpPyIiOiIuanMiKSkuY2hhckF0KDApfHxzLm1hdGNoKC9eW1x3XCtcLlwtXSs6Lyk/IiI6eS5iYXNlVXJsKStzfXJldHVybiB5LnVybEFyZ3MmJiEvXmJsb2JcOi8udGVzdChzKT9zK3kudXJsQXJncyhlLHMpOnN9LGxvYWQ6ZnVuY3Rpb24oZSx0KXtyZXEubG9hZChxLGUsdCl9LGV4ZWNDYjpmdW5jdGlvbihlLHQsaSxyKXtyZXR1cm4gdC5hcHBseShyLGkpfSxvblNjcmlwdExvYWQ6ZnVuY3Rpb24oZSl7aWYoImxvYWQiPT09ZS50eXBlfHxyZWFkeVJlZ0V4cC50ZXN0KChlLmN1cnJlbnRUYXJnZXR8fGUuc3JjRWxlbWVudCkucmVhZHlTdGF0ZSkpe2ludGVyYWN0aXZlU2NyaXB0PW51bGw7dmFyIHQ9ZyhlKTtxLmNvbXBsZXRlTG9hZCh0LmlkKX19LG9uU2NyaXB0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQ9ZyhlKTtpZighbih0LmlkKSl7dmFyIGk9W107cmV0dXJuIGVhY2hQcm9wKFMsZnVuY3Rpb24oZSxyKXswIT09ci5pbmRleE9mKCJfQHIiKSYmZWFjaChlLmRlcE1hcHMsZnVuY3Rpb24oZSl7aWYoZS5pZD09PXQuaWQpcmV0dXJuIGkucHVzaChyKSwhMH0pfSksYyhtYWtlRXJyb3IoInNjcmlwdGVycm9yIiwnU2NyaXB0IGVycm9yIGZvciAiJyt0LmlkKyhpLmxlbmd0aD8nIiwgbmVlZGVkIGJ5OiAnK2kuam9pbigiLCAiKTonIicpLGUsW3QuaWRdKSl9fX0scS5yZXF1aXJlPXEubWFrZVJlcXVpcmUoKSxxfWZ1bmN0aW9uIGdldEludGVyYWN0aXZlU2NyaXB0KCl7cmV0dXJuIGludGVyYWN0aXZlU2NyaXB0JiYiaW50ZXJhY3RpdmUiPT09aW50ZXJhY3RpdmVTY3JpcHQucmVhZHlTdGF0ZT9pbnRlcmFjdGl2ZVNjcmlwdDooZWFjaFJldmVyc2Uoc2NyaXB0cygpLGZ1bmN0aW9uKGUpe2lmKCJpbnRlcmFjdGl2ZSI9PT1lLnJlYWR5U3RhdGUpcmV0dXJuIGludGVyYWN0aXZlU2NyaXB0PWV9KSxpbnRlcmFjdGl2ZVNjcmlwdCl9dmFyIHJlcSxzLGhlYWQsYmFzZUVsZW1lbnQsZGF0YU1haW4sc3JjLGludGVyYWN0aXZlU2NyaXB0LGN1cnJlbnRseUFkZGluZ1NjcmlwdCxtYWluU2NyaXB0LHN1YlBhdGgsdmVyc2lvbj0iMi4zLjUiLGNvbW1lbnRSZWdFeHA9L1wvXCpbXHNcU10qP1wqXC98KFteOiInPV18XilcL1wvLiokL2dtLGNqc1JlcXVpcmVSZWdFeHA9L1teLl1ccypyZXF1aXJlXHMqXChccypbIiddKFteJyJcc10rKVsiJ11ccypcKS9nLGpzU3VmZml4UmVnRXhwPS9cLmpzJC8sY3VyckRpclJlZ0V4cD0vXlwuXC8vLG9wPU9iamVjdC5wcm90b3R5cGUsb3N0cmluZz1vcC50b1N0cmluZyxoYXNPd249b3AuaGFzT3duUHJvcGVydHksaXNCcm93c2VyPSEoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yfHwhd2luZG93LmRvY3VtZW50KSxpc1dlYldvcmtlcj0haXNCcm93c2VyJiYidW5kZWZpbmVkIiE9dHlwZW9mIGltcG9ydFNjcmlwdHMscmVhZHlSZWdFeHA9aXNCcm93c2VyJiYiUExBWVNUQVRJT04gMyI9PT1uYXZpZ2F0b3IucGxhdGZvcm0/L15jb21wbGV0ZSQvOi9eKGNvbXBsZXRlfGxvYWRlZCkkLyxkZWZDb250ZXh0TmFtZT0iXyIsaXNPcGVyYT0idW5kZWZpbmVkIiE9dHlwZW9mIG9wZXJhJiYiW29iamVjdCBPcGVyYV0iPT09b3BlcmEudG9TdHJpbmcoKSxjb250ZXh0cz17fSxjZmc9e30sZ2xvYmFsRGVmUXVldWU9W10sdXNlSW50ZXJhY3RpdmU9ITE7aWYodm9pZCAwPT09ZGVmaW5lKXtpZih2b2lkIDAhPT1yZXF1aXJlanMpe2lmKGlzRnVuY3Rpb24ocmVxdWlyZWpzKSlyZXR1cm47Y2ZnPXJlcXVpcmVqcyxyZXF1aXJlanM9dm9pZCAwfXZvaWQgMD09PXJlcXVpcmV8fGlzRnVuY3Rpb24ocmVxdWlyZSl8fChjZmc9cmVxdWlyZSxyZXF1aXJlPXZvaWQgMCkscmVxPXJlcXVpcmVqcz1mdW5jdGlvbihlLHQsaSxyKXt2YXIgbixvLGE9ZGVmQ29udGV4dE5hbWU7cmV0dXJuIGlzQXJyYXkoZSl8fCJzdHJpbmciPT10eXBlb2YgZXx8KG89ZSxpc0FycmF5KHQpPyhlPXQsdD1pLGk9cik6ZT1bXSksbyYmby5jb250ZXh0JiYoYT1vLmNvbnRleHQpLChuPWdldE93bihjb250ZXh0cyxhKSl8fChuPWNvbnRleHRzW2FdPXJlcS5zLm5ld0NvbnRleHQoYSkpLG8mJm4uY29uZmlndXJlKG8pLG4ucmVxdWlyZShlLHQsaSl9LHJlcS5jb25maWc9ZnVuY3Rpb24oZSl7cmV0dXJuIHJlcShlKX0scmVxLm5leHRUaWNrPXZvaWQgMCE9PXNldFRpbWVvdXQ/ZnVuY3Rpb24oZSl7c2V0VGltZW91dChlLDQpfTpmdW5jdGlvbihlKXtlKCl9LHJlcXVpcmV8fChyZXF1aXJlPXJlcSkscmVxLnZlcnNpb249dmVyc2lvbixyZXEuanNFeHRSZWdFeHA9L15cL3w6fFw/fFwuanMkLyxyZXEuaXNCcm93c2VyPWlzQnJvd3NlcixzPXJlcS5zPXtjb250ZXh0czpjb250ZXh0cyxuZXdDb250ZXh0Om5ld0NvbnRleHR9LHJlcSh7fSksZWFjaChbInRvVXJsIiwidW5kZWYiLCJkZWZpbmVkIiwic3BlY2lmaWVkIl0sZnVuY3Rpb24oZSl7cmVxW2VdPWZ1bmN0aW9uKCl7dmFyIHQ9Y29udGV4dHNbZGVmQ29udGV4dE5hbWVdO3JldHVybiB0LnJlcXVpcmVbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0pLGlzQnJvd3NlciYmKGhlYWQ9cy5oZWFkPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sKGJhc2VFbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIilbMF0pJiYoaGVhZD1zLmhlYWQ9YmFzZUVsZW1lbnQucGFyZW50Tm9kZSkpLHJlcS5vbkVycm9yPWRlZmF1bHRPbkVycm9yLHJlcS5jcmVhdGVOb2RlPWZ1bmN0aW9uKGUsdCxpKXt2YXIgcj1lLnhodG1sP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImh0bWw6c2NyaXB0Iik6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cmV0dXJuIHIudHlwZT1lLnNjcmlwdFR5cGV8fCJ0ZXh0L2phdmFzY3JpcHQiLHIuY2hhcnNldD0idXRmLTgiLHIuYXN5bmM9ITAscn0scmVxLmxvYWQ9ZnVuY3Rpb24oZSx0LGkpe3ZhciByLG49ZSYmZS5jb25maWd8fHt9O2lmKGlzQnJvd3NlcilyZXR1cm4ocj1yZXEuY3JlYXRlTm9kZShuLHQsaSkpLnNldEF0dHJpYnV0ZSgiZGF0YS1yZXF1aXJlY29udGV4dCIsZS5jb250ZXh0TmFtZSksci5zZXRBdHRyaWJ1dGUoImRhdGEtcmVxdWlyZW1vZHVsZSIsdCksIXIuYXR0YWNoRXZlbnR8fHIuYXR0YWNoRXZlbnQudG9TdHJpbmcmJnIuYXR0YWNoRXZlbnQudG9TdHJpbmcoKS5pbmRleE9mKCJbbmF0aXZlIGNvZGUiKTwwfHxpc09wZXJhPyhyLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUub25TY3JpcHRMb2FkLCExKSxyLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlLm9uU2NyaXB0RXJyb3IsITEpKToodXNlSW50ZXJhY3RpdmU9ITAsci5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixlLm9uU2NyaXB0TG9hZCkpLHIuc3JjPWksbi5vbk5vZGVDcmVhdGVkJiZuLm9uTm9kZUNyZWF0ZWQocixuLHQsaSksY3VycmVudGx5QWRkaW5nU2NyaXB0PXIsYmFzZUVsZW1lbnQ/aGVhZC5pbnNlcnRCZWZvcmUocixiYXNlRWxlbWVudCk6aGVhZC5hcHBlbmRDaGlsZChyKSxjdXJyZW50bHlBZGRpbmdTY3JpcHQ9bnVsbCxyO2lmKGlzV2ViV29ya2VyKXRyeXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwwKSxpbXBvcnRTY3JpcHRzKGkpLGUuY29tcGxldGVMb2FkKHQpfWNhdGNoKHIpe2Uub25FcnJvcihtYWtlRXJyb3IoImltcG9ydHNjcmlwdHMiLCJpbXBvcnRTY3JpcHRzIGZhaWxlZCBmb3IgIit0KyIgYXQgIitpLHIsW3RdKSl9fSxpc0Jyb3dzZXImJiFjZmcuc2tpcERhdGFNYWluJiZlYWNoUmV2ZXJzZShzY3JpcHRzKCksZnVuY3Rpb24oZSl7aWYoaGVhZHx8KGhlYWQ9ZS5wYXJlbnROb2RlKSxkYXRhTWFpbj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1tYWluIikpcmV0dXJuIG1haW5TY3JpcHQ9ZGF0YU1haW4sY2ZnLmJhc2VVcmx8fC0xIT09bWFpblNjcmlwdC5pbmRleE9mKCIhIil8fChzcmM9bWFpblNjcmlwdC5zcGxpdCgiLyIpLG1haW5TY3JpcHQ9c3JjLnBvcCgpLHN1YlBhdGg9c3JjLmxlbmd0aD9zcmMuam9pbigiLyIpKyIvIjoiLi8iLGNmZy5iYXNlVXJsPXN1YlBhdGgpLG1haW5TY3JpcHQ9bWFpblNjcmlwdC5yZXBsYWNlKGpzU3VmZml4UmVnRXhwLCIiKSxyZXEuanNFeHRSZWdFeHAudGVzdChtYWluU2NyaXB0KSYmKG1haW5TY3JpcHQ9ZGF0YU1haW4pLGNmZy5kZXBzPWNmZy5kZXBzP2NmZy5kZXBzLmNvbmNhdChtYWluU2NyaXB0KTpbbWFpblNjcmlwdF0sITB9KSxkZWZpbmU9ZnVuY3Rpb24oZSx0LGkpe3ZhciByLG47InN0cmluZyIhPXR5cGVvZiBlJiYoaT10LHQ9ZSxlPW51bGwpLGlzQXJyYXkodCl8fChpPXQsdD1udWxsKSwhdCYmaXNGdW5jdGlvbihpKSYmKHQ9W10saS5sZW5ndGgmJihpLnRvU3RyaW5nKCkucmVwbGFjZShjb21tZW50UmVnRXhwLGNvbW1lbnRSZXBsYWNlKS5yZXBsYWNlKGNqc1JlcXVpcmVSZWdFeHAsZnVuY3Rpb24oZSxpKXt0LnB1c2goaSl9KSx0PSgxPT09aS5sZW5ndGg/WyJyZXF1aXJlIl06WyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdKS5jb25jYXQodCkpKSx1c2VJbnRlcmFjdGl2ZSYmKHI9Y3VycmVudGx5QWRkaW5nU2NyaXB0fHxnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpKSYmKGV8fChlPXIuZ2V0QXR0cmlidXRlKCJkYXRhLXJlcXVpcmVtb2R1bGUiKSksbj1jb250ZXh0c1tyLmdldEF0dHJpYnV0ZSgiZGF0YS1yZXF1aXJlY29udGV4dCIpXSksbj8obi5kZWZRdWV1ZS5wdXNoKFtlLHQsaV0pLG4uZGVmUXVldWVNYXBbZV09ITApOmdsb2JhbERlZlF1ZXVlLnB1c2goW2UsdCxpXSl9LGRlZmluZS5hbWQ9e2pRdWVyeTohMH0scmVxLmV4ZWM9ZnVuY3Rpb24odGV4dCl7cmV0dXJuIGV2YWwodGV4dCl9LHJlcShjZmcpfX0odGhpcywidW5kZWZpbmVkIj09dHlwZW9mIHNldFRpbWVvdXQ/dm9pZCAwOnNldFRpbWVvdXQp
Protocol
HTTP/1.1
Server
194.66.87.68 , United Kingdom, ASN786 (JANET Jisc Services Limited, GB),
Reverse DNS
campusmoodle.rgu.ac.uk
Software
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4 / PHP/7.1.4
Resource Hash
4d8b560b0de451450b378976aadf95623e77714bfdcddf7a4602332d2c98d394

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sun, 06 Sep 2020 09:31:39 GMT
Content-Encoding
gzip
X-Powered-By
PHP/7.1.4
Transfer-Encoding
chunked
Content-Disposition
inline; filename="javascript.php"
Connection
Keep-Alive
Pragma
Last-Modified
Thu, 13 Aug 2020 20:32:43 GMT
Server
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4
Etag
"66750d3e0001a939792cc94dea4a56b92437eb80"
Vary
Accept-Encoding
Content-Type
application/javascript; charset=utf-8
Cache-Control
public, max-age=7776000, immutable
Accept-Ranges
none
Keep-Alive
timeout=5, max=98
Expires
Sat, 05 Dec 2020 09:31:39 GMT
yui_combo.php
campusmoodle.rgu.ac.uk/theme/
15 KB
5 KB
Script
General
Full URL
http://campusmoodle.rgu.ac.uk/theme/yui_combo.php?3.17.2/event-mousewheel/event-mousewheel-min.js&3.17.2/event-resize/event-resize-min.js&3.17.2/event-hover/event-hover-min.js&3.17.2/event-touch/event-touch-min.js&3.17.2/event-move/event-move-min.js&3.17.2/event-flick/event-flick-min.js&3.17.2/event-valuechange/event-valuechange-min.js&3.17.2/event-tap/event-tap-min.js
Requested by
Host: application
URL: data:application/javascript;base64,LyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCnR5cGVvZiBZVUkhPSJ1bmRlZmluZWQiJiYoWVVJLl9ZVUk9WVVJKTt2YXIgWVVJPWZ1bmN0aW9uKCl7dmFyIGU9MCx0PXRoaXMsbj1hcmd1bWVudHMscj1uLmxlbmd0aCxpPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmUuaGFzT3duUHJvcGVydHkmJmUgaW5zdGFuY2VvZiB0fSxzPXR5cGVvZiBZVUlfY29uZmlnIT0idW5kZWZpbmVkIiYmWVVJX2NvbmZpZztpKHQsWVVJKT8odC5faW5pdCgpLFlVSS5HbG9iYWxDb25maWcmJnQuYXBwbHlDb25maWcoWVVJLkdsb2JhbENvbmZpZykscyYmdC5hcHBseUNvbmZpZyhzKSxyfHx0Ll9zZXR1cCgpKTp0PW5ldyBZVUk7aWYocil7Zm9yKDtlPHI7ZSsrKXQuYXBwbHlDb25maWcobltlXSk7dC5fc2V0dXAoKX1yZXR1cm4gdC5pbnN0YW5jZU9mPWksdH07KGZ1bmN0aW9uKCl7dmFyIGUsdCxuPSIzLjE3LjIiLHI9Ii4iLGk9Imh0dHA6Ly95dWkueWFob29hcGlzLmNvbS8iLHM9Inl1aTMtanMtZW5hYmxlZCIsbz0ieXVpMy1jc3Mtc3RhbXAiLHU9ZnVuY3Rpb24oKXt9LGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLGY9eyJpby54ZHJSZWFkeSI6MSwiaW8ueGRyUmVzcG9uc2UiOjEsIlNXRi5ldmVudEhhbmRsZXIiOjF9LGw9dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCIsYz1sP3dpbmRvdzpudWxsLGg9bD9jLmRvY3VtZW50Om51bGwscD1oJiZoLmRvY3VtZW50RWxlbWVudCxkPXAmJnAuY2xhc3NOYW1lLHY9e30sbT0obmV3IERhdGUpLmdldFRpbWUoKSxnPWZ1bmN0aW9uKGUsdCxuLHIpe2UmJmUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLHIpOmUmJmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9uIit0LG4pfSx5PWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcil0cnl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbixyKX1jYXRjaChpKXt9ZWxzZSBlJiZlLmRldGFjaEV2ZW50JiZlLmRldGFjaEV2ZW50KCJvbiIrdCxuKX0sYj1mdW5jdGlvbigpe1lVSS5FbnYuRE9NUmVhZHk9ITAsbCYmeShoLCJET01Db250ZW50TG9hZGVkIixiKX0sdz1mdW5jdGlvbigpe1lVSS5FbnYud2luZG93TG9hZGVkPSEwLFlVSS5FbnYuRE9NUmVhZHk9ITAsbCYmeSh3aW5kb3csImxvYWQiLHcpfSxFPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5FbnYuX2xvYWRlcixyPVsibG9hZGVyLWJhc2UiXSxpPVlVSS5FbnYscz1pLm1vZHM7cmV0dXJuIG4/KG4uaWdub3JlUmVnaXN0ZXJlZD0hMSxuLm9uRW5kPW51bGwsbi5kYXRhPW51bGwsbi5yZXF1aXJlZD1bXSxuLmxvYWRUeXBlPW51bGwpOihuPW5ldyBlLkxvYWRlcihlLmNvbmZpZyksZS5FbnYuX2xvYWRlcj1uKSxzJiZzLmxvYWRlciYmKHI9W10uY29uY2F0KHIsWVVJLkVudi5sb2FkZXJFeHRyYXMpKSxZVUkuRW52LmNvcmU9ZS5BcnJheS5kZWR1cGUoW10uY29uY2F0KFlVSS5FbnYuY29yZSxyKSksbn0sUz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSx4PXtzdWNjZXNzOiEwfTtwJiZkLmluZGV4T2Yocyk9PS0xJiYoZCYmKGQrPSIgIiksZCs9cyxwLmNsYXNzTmFtZT1kKSxuLmluZGV4T2YoIkAiKT4tMSYmKG49IjMuNS4wIiksZT17YXBwbHlDb25maWc6ZnVuY3Rpb24oZSl7ZT1lfHx1O3ZhciB0LG4scj10aGlzLmNvbmZpZyxpPXIubW9kdWxlcyxzPXIuZ3JvdXBzLG89ci5hbGlhc2VzLGE9dGhpcy5FbnYuX2xvYWRlcjtmb3IobiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0PWVbbl0saSYmbj09Im1vZHVsZXMiP1MoaSx0KTpvJiZuPT0iYWxpYXNlcyI/UyhvLHQpOnMmJm49PSJncm91cHMiP1Mocyx0KTpuPT0id2luIj8ocltuXT10JiZ0LmNvbnRlbnRXaW5kb3d8fHQsci5kb2M9cltuXT9yW25dLmRvY3VtZW50Om51bGwpOm4hPSJfeXVpZCImJihyW25dPXQpKTthJiZhLl9jb25maWcoZSl9LF9jb25maWc6ZnVuY3Rpb24oZSl7dGhpcy5hcHBseUNvbmZpZyhlKX0sX2luaXQ6ZnVuY3Rpb24oKXt2YXIgZSx0LHI9dGhpcyxzPVlVSS5FbnYsdT1yLkVudixhO3IudmVyc2lvbj1uO2lmKCF1KXtyLkVudj17Y29yZTpbImdldCIsImZlYXR1cmVzIiwiaW50bC1iYXNlIiwieXVpLWxvZyIsInl1aS1sYXRlciIsImxvYWRlci1iYXNlIiwibG9hZGVyLXJvbGx1cCIsImxvYWRlci15dWkzIl0sbG9hZGVyRXh0cmFzOlsibG9hZGVyLXJvbGx1cCIsImxvYWRlci15dWkzIl0sbW9kczp7fSx2ZXJzaW9uczp7fSxiYXNlOmksY2RuOmkrbisiL2J1aWxkLyIsX2lkeDowLF91c2VkOnt9LF9hdHRhY2hlZDp7fSxfZXhwb3J0ZWQ6e30sX21pc3NlZDpbXSxfeWlkeDowLF91aWR4OjAsX2d1aWRwOiJ5IixfbG9hZGVkOnt9LF9CQVNFX1JFOi8oPzpcPyg/OlteJl0qJikqKFteJl0qKSk/XGIoeXVpKD86LVx3Kyk/KVwvXDIoPzotKG1pbnxkZWJ1ZykpP1wuanMvLHBhcnNlQmFzZVBhdGg6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1hdGNoKHQpLHIsaTtyZXR1cm4gbiYmKHI9UmVnRXhwLmxlZnRDb250ZXh0fHxlLnNsaWNlKDAsZS5pbmRleE9mKG5bMF0pKSxpPW5bM10sblsxXSYmKHIrPSI/IituWzFdKSxyPXtmaWx0ZXI6aSxwYXRoOnJ9KSxyfSxnZXRCYXNlOnMmJnMuZ2V0QmFzZXx8ZnVuY3Rpb24odCl7dmFyIG49aCYmaC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iil8fFtdLGk9dS5jZG4scyxvLGEsZjtmb3Iobz0wLGE9bi5sZW5ndGg7bzxhOysrbyl7Zj1uW29dLnNyYztpZihmKXtzPXIuRW52LnBhcnNlQmFzZVBhdGgoZix0KTtpZihzKXtlPXMuZmlsdGVyLGk9cy5wYXRoO2JyZWFrfX19cmV0dXJuIGl9fSx1PXIuRW52LHUuX2xvYWRlZFtuXT17fTtpZihzJiZyIT09WVVJKXUuX3lpZHg9KytzLl95aWR4LHUuX2d1aWRwPSgieXVpXyIrbisiXyIrdS5feWlkeCsiXyIrbSkucmVwbGFjZSgvW15hLXowLTlfXSsvZywiXyIpO2Vsc2UgaWYoWVVJLl9ZVUkpe3M9WVVJLl9ZVUkuRW52LHUuX3lpZHgrPXMuX3lpZHgsdS5fdWlkeCs9cy5fdWlkeDtmb3IoYSBpbiBzKWEgaW4gdXx8KHVbYV09c1thXSk7ZGVsZXRlIFlVSS5fWVVJfXIuaWQ9ci5zdGFtcChyKSx2W3IuaWRdPXJ9ci5jb25zdHJ1Y3Rvcj1ZVUksci5jb25maWc9ci5jb25maWd8fHtib290c3RyYXA6ITAsY2FjaGVVc2U6ITAsZGVidWc6ITAsZG9jOmgsZmV0Y2hDU1M6ITAsdGhyb3dGYWlsOiEwLHVzZUJyb3dzZXJDb25zb2xlOiEwLHVzZU5hdGl2ZUVTNTohMCx3aW46YyxnbG9iYWw6RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0saCYmIWguZ2V0RWxlbWVudEJ5SWQobyk/KHQ9aC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LmlubmVySFRNTD0nPGRpdiBpZD0iJytvKyciIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQiPjwvZGl2PicsWVVJLkVudi5jc3NTdGFtcEVsPXQuZmlyc3RDaGlsZCxoLmJvZHk/aC5ib2R5LmFwcGVuZENoaWxkKFlVSS5FbnYuY3NzU3RhbXBFbCk6cC5pbnNlcnRCZWZvcmUoWVVJLkVudi5jc3NTdGFtcEVsLHAuZmlyc3RDaGlsZCkpOmgmJmguZ2V0RWxlbWVudEJ5SWQobykmJiFZVUkuRW52LmNzc1N0YW1wRWwmJihZVUkuRW52LmNzc1N0YW1wRWw9aC5nZXRFbGVtZW50QnlJZChvKSksci5jb25maWcubGFuZz1yLmNvbmZpZy5sYW5nfHwiZW4tVVMiLHIuY29uZmlnLmJhc2U9WVVJLmNvbmZpZy5iYXNlfHxyLkVudi5nZXRCYXNlKHIuRW52Ll9CQVNFX1JFKTtpZighZXx8ISJtaW5kZWJ1ZyIuaW5kZXhPZihlKSllPSJtaW4iO2U9ZT8iLSIrZTplLHIuY29uZmlnLmxvYWRlclBhdGg9WVVJLmNvbmZpZy5sb2FkZXJQYXRofHwibG9hZGVyL2xvYWRlciIrZSsiLmpzIn0sX3NldHVwOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLG49W10scj1ZVUkuRW52Lm1vZHMsaT10LmNvbmZpZy5jb3JlfHxbXS5jb25jYXQoWVVJLkVudi5jb3JlKTtmb3IoZT0wO2U8aS5sZW5ndGg7ZSsrKXJbaVtlXV0mJm4ucHVzaChpW2VdKTt0Ll9hdHRhY2goWyJ5dWktYmFzZSJdKSx0Ll9hdHRhY2gobiksdC5Mb2FkZXImJkUodCl9LGFwcGx5VG86ZnVuY3Rpb24oZSx0LG4pe2lmKHQgaW4gZil7dmFyIHI9dltlXSxpLHMsbztpZihyKXtpPXQuc3BsaXQoIi4iKSxzPXI7Zm9yKG89MDtvPGkubGVuZ3RoO28rPTEpcz1zW2lbb11dLHN8fHRoaXMubG9nKCJhcHBseVRvIG5vdCBmb3VuZDogIit0LCJ3YXJuIiwieXVpIik7cmV0dXJuIHMmJnMuYXBwbHkocixuKX1yZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5sb2codCsiOiBhcHBseVRvIG5vdCBhbGxvd2VkIiwid2FybiIsInl1aSIpLG51bGx9LGFkZDpmdW5jdGlvbihlLHQsbixyKXtyPXJ8fHt9O3ZhciBpPVlVSS5FbnYscz17bmFtZTplLGZuOnQsdmVyc2lvbjpuLGRldGFpbHM6cn0sbz17fSx1LGEsZixsLGM9aS52ZXJzaW9ucztpLm1vZHNbZV09cyxjW25dPWNbbl18fHt9LGNbbl1bZV09cztmb3IobCBpbiB2KXYuaGFzT3duUHJvcGVydHkobCkmJihhPXZbbF0sb1thLmlkXXx8KG9bYS5pZF09ITAsdT1hLkVudi5fbG9hZGVyLHUmJihmPXUuZ2V0TW9kdWxlSW5mbyhlKSwoIWZ8fGYudGVtcCkmJnUuYWRkTW9kdWxlKHIsZSkpKSk7cmV0dXJuIHRoaXN9LF9hdHRhY2g6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvLHUsYSxmPVlVSS5FbnYubW9kcyxsPVlVSS5FbnYuYWxpYXNlcyxjPXRoaXMsaCxwPVlVSS5FbnYuX3JlbmRlcmVkTW9kcyxkPWMuRW52Ll9sb2FkZXIsdj1jLkVudi5fYXR0YWNoZWQsbT1jLkVudi5fZXhwb3J0ZWQsZz1lLmxlbmd0aCxkLHksYix3PVtdLEUsUyx4LFQsTixDLGs7Zm9yKG49MDtuPGc7bisrKXtyPWVbbl0saT1mW3JdLHcucHVzaChyKTtpZihkJiZkLmNvbmRpdGlvbnNbcl0pZm9yKGggaW4gZC5jb25kaXRpb25zW3JdKWQuY29uZGl0aW9uc1tyXS5oYXNPd25Qcm9wZXJ0eShoKSYmKHk9ZC5jb25kaXRpb25zW3JdW2hdLGI9eSYmKHkudWEmJmMuVUFbeS51YV18fHkudGVzdCYmeS50ZXN0KGMpKSxiJiZ3LnB1c2goeS5uYW1lKSl9ZT13LGc9ZS5sZW5ndGg7Zm9yKG49MDtuPGc7bisrKWlmKCF2W2Vbbl1dKXtyPWVbbl0saT1mW3JdO2lmKGwmJmxbcl0mJiFpKXtjLl9hdHRhY2gobFtyXSk7Y29udGludWV9aWYoIWkpVD1kJiZkLmdldE1vZHVsZUluZm8ociksVCYmKGk9VCx0PSEwKSwhdCYmciYmci5pbmRleE9mKCJza2luLSIpPT09LTEmJnIuaW5kZXhPZigiY3NzIik9PT0tMSYmKGMuRW52Ll9taXNzZWQucHVzaChyKSxjLkVudi5fbWlzc2VkPWMuQXJyYXkuZGVkdXBlKGMuRW52Ll9taXNzZWQpLGMubWVzc2FnZSgiTk9UIGxvYWRlZDogIityLCJ3YXJuIiwieXVpIikpO2Vsc2V7dltyXT0hMDtmb3IoaD0wO2g8Yy5FbnYuX21pc3NlZC5sZW5ndGg7aCsrKWMuRW52Ll9taXNzZWRbaF09PT1yJiYoYy5tZXNzYWdlKCJGb3VuZDogIityKyIgKHdhcyByZXBvcnRlZCBhcyBtaXNzaW5nIGVhcmxpZXIpIiwid2FybiIsInl1aSIpLGMuRW52Ll9taXNzZWQuc3BsaWNlKGgsMSkpO2lmKGQmJiFkLl9jYW5CZUF0dGFjaGVkKHIpKXJldHVybiEwO2lmKGQmJnAmJnBbcl0mJnBbcl0udGVtcCl7ZC5nZXRSZXF1aXJlcyhwW3JdKSxvPVtdLFQ9ZC5nZXRNb2R1bGVJbmZvKHIpO2ZvcihoIGluIFQuZXhwYW5kZWRfbWFwKVQuZXhwYW5kZWRfbWFwLmhhc093blByb3BlcnR5KGgpJiZvLnB1c2goaCk7Yy5fYXR0YWNoKG8pfXM9aS5kZXRhaWxzLG89cy5yZXF1aXJlcyxTPXMuZXMsdT1zLnVzZSxhPXMuYWZ0ZXIscy5sYW5nJiYobz1vfHxbXSxvLnVuc2hpZnQoImludGwiKSk7aWYobyl7eD1vLmxlbmd0aDtmb3IoaD0wO2g8eDtoKyspaWYoIXZbb1toXV0pe2lmKCFjLl9hdHRhY2gobykpcmV0dXJuITE7YnJlYWt9fWlmKGEpZm9yKGg9MDtoPGEubGVuZ3RoO2grKylpZighdlthW2hdXSl7aWYoIWMuX2F0dGFjaChhLCEwKSlyZXR1cm4hMTticmVha31pZihpLmZuKXtFPVtjLHJdO2lmKFMpe2s9e30sQz17fSxFLnB1c2goayxDKTtpZihvKXt4PW8ubGVuZ3RoO2ZvcihoPTA7aDx4O2grKylrW29baF1dPW0uaGFzT3duUHJvcGVydHkob1toXSk/bVtvW2hdXTpjfX1pZihjLmNvbmZpZy50aHJvd0ZhaWwpQz1pLmZuCi5hcHBseShTP3VuZGVmaW5lZDppLEUpO2Vsc2UgdHJ5e0M9aS5mbi5hcHBseShTP3VuZGVmaW5lZDppLEUpfWNhdGNoKEwpe3JldHVybiBjLmVycm9yKCJBdHRhY2ggZXJyb3I6ICIrcixMLHIpLCExfVMmJihtW3JdPUMsTj1pLmRldGFpbHMuY29uZGl0aW9uLE4mJk4ud2hlbj09PSJpbnN0ZWFkIiYmKG1bTi50cmlnZ2VyXT1DKSl9aWYodSlmb3IoaD0wO2g8dS5sZW5ndGg7aCsrKWlmKCF2W3VbaF1dKXtpZighYy5fYXR0YWNoKHUpKXJldHVybiExO2JyZWFrfX19cmV0dXJuITB9LF9kZWxheUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPVsiZXZlbnQtYmFzZSJdO3JldHVybiB0PW4uTGFuZy5pc09iamVjdCh0KT90OntldmVudDp0fSx0LmV2ZW50PT09ImxvYWQiJiZyLnB1c2goImV2ZW50LXN5bnRoZXRpYyIpLGZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzO24uX3VzZShyLGZ1bmN0aW9uKCl7bi5vbih0LmV2ZW50LGZ1bmN0aW9uKCl7aVsxXS5kZWxheVVudGlsPXQuZXZlbnQsZS5hcHBseShuLGkpfSx0LmFyZ3MpfSl9fSx1c2U6ZnVuY3Rpb24oKXt2YXIgZT1hLmNhbGwoYXJndW1lbnRzLDApLHQ9ZVtlLmxlbmd0aC0xXSxuPXRoaXMscj0wLGkscz1uLkVudixvPSEwO24uTGFuZy5pc0Z1bmN0aW9uKHQpPyhlLnBvcCgpLG4uY29uZmlnLmRlbGF5VW50aWwmJih0PW4uX2RlbGF5Q2FsbGJhY2sodCxuLmNvbmZpZy5kZWxheVVudGlsKSkpOnQ9bnVsbCxuLkxhbmcuaXNBcnJheShlWzBdKSYmKGU9ZVswXSk7aWYobi5jb25maWcuY2FjaGVVc2Upe3doaWxlKGk9ZVtyKytdKWlmKCFzLl9hdHRhY2hlZFtpXSl7bz0hMTticmVha31pZihvKXJldHVybiBlLmxlbmd0aCxuLl9ub3RpZnkodCx4LGUpLG59cmV0dXJuIG4uX2xvYWRpbmc/KG4uX3VzZVF1ZXVlPW4uX3VzZVF1ZXVlfHxuZXcgbi5RdWV1ZSxuLl91c2VRdWV1ZS5hZGQoW2UsdF0pKTpuLl91c2UoZSxmdW5jdGlvbihuLHIpe24uX25vdGlmeSh0LHIsZSl9KSxufSxyZXF1aXJlOmZ1bmN0aW9uKCl7dmFyIGU9YS5jYWxsKGFyZ3VtZW50cyksdDt0eXBlb2YgZVtlLmxlbmd0aC0xXT09ImZ1bmN0aW9uIiYmKHQ9ZS5wb3AoKSxlLnB1c2goZnVuY3Rpb24obil7dmFyIHIsaT1lLmxlbmd0aCxzPW4uRW52Ll9leHBvcnRlZCxvPXt9O2ZvcihyPTA7cjxpO3IrKylzLmhhc093blByb3BlcnR5KGVbcl0pJiYob1tlW3JdXT1zW2Vbcl1dKTt0LmNhbGwodW5kZWZpbmVkLG4sbyl9KSksdGhpcy51c2UuYXBwbHkodGhpcyxlKX0sX25vdGlmeTpmdW5jdGlvbihlLHQsbil7aWYoIXQuc3VjY2VzcyYmdGhpcy5jb25maWcubG9hZEVycm9yRm4pdGhpcy5jb25maWcubG9hZEVycm9yRm4uY2FsbCh0aGlzLHRoaXMsZSx0LG4pO2Vsc2UgaWYoZSl7dGhpcy5FbnYuX21pc3NlZCYmdGhpcy5FbnYuX21pc3NlZC5sZW5ndGgmJih0Lm1zZz0iTWlzc2luZyBtb2R1bGVzOiAiK3RoaXMuRW52Ll9taXNzZWQuam9pbigpLHQuc3VjY2Vzcz0hMSk7aWYodGhpcy5jb25maWcudGhyb3dGYWlsKWUodGhpcyx0KTtlbHNlIHRyeXtlKHRoaXMsdCl9Y2F0Y2gocil7dGhpcy5lcnJvcigidXNlIGNhbGxiYWNrIGVycm9yIixyLG4pfX19LF91c2U6ZnVuY3Rpb24oZSx0KXt0aGlzLkFycmF5fHx0aGlzLl9hdHRhY2goWyJ5dWktYmFzZSJdKTt2YXIgcixpLHMsbz10aGlzLHU9WVVJLkVudixhPXUubW9kcyxmPW8uRW52LGw9Zi5fdXNlZCxjPXUuYWxpYXNlcyxoPXUuX2xvYWRlclF1ZXVlLHA9ZVswXSxkPW8uQXJyYXksdj1vLmNvbmZpZyxtPXYuYm9vdHN0cmFwLGc9W10seSxiPVtdLHc9ITAsUz12LmZldGNoQ1NTLHg9ZnVuY3Rpb24oZSx0KXt2YXIgcj0wLGk9W10scyxvLGYsaCxwO2lmKCFlLmxlbmd0aClyZXR1cm47aWYoYyl7bz1lLmxlbmd0aDtmb3Iocj0wO3I8bztyKyspY1tlW3JdXSYmIWFbZVtyXV0/aT1bXS5jb25jYXQoaSxjW2Vbcl1dKTppLnB1c2goZVtyXSk7ZT1pfW89ZS5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKXtzPWVbcl0sdHx8Yi5wdXNoKHMpO2lmKGxbc10pY29udGludWU7Zj1hW3NdLGg9bnVsbCxwPW51bGwsZj8obFtzXT0hMCxoPWYuZGV0YWlscy5yZXF1aXJlcyxwPWYuZGV0YWlscy51c2UpOnUuX2xvYWRlZFtuXVtzXT9sW3NdPSEwOmcucHVzaChzKSxoJiZoLmxlbmd0aCYmeChoKSxwJiZwLmxlbmd0aCYmeChwLDEpfX0sVD1mdW5jdGlvbihuKXt2YXIgcj1ufHx7c3VjY2VzczohMCxtc2c6Im5vdCBkeW5hbWljIn0saSxzLHU9ITAsYT1yLmRhdGE7by5fbG9hZGluZz0hMSxhJiYocz1nLGc9W10sYj1bXSx4KGEpLGk9Zy5sZW5ndGgsaSYmW10uY29uY2F0KGcpLnNvcnQoKS5qb2luKCk9PXMuc29ydCgpLmpvaW4oKSYmKGk9ITEpKSxpJiZhPyhvLl9sb2FkaW5nPSEwLG8uX3VzZShnLGZ1bmN0aW9uKCl7by5fYXR0YWNoKGEpJiZvLl9ub3RpZnkodCxyLGEpfSkpOihhJiYodT1vLl9hdHRhY2goYSkpLHUmJm8uX25vdGlmeSh0LHIsZSkpLG8uX3VzZVF1ZXVlJiZvLl91c2VRdWV1ZS5zaXplKCkmJiFvLl9sb2FkaW5nJiZvLl91c2UuYXBwbHkobyxvLl91c2VRdWV1ZS5uZXh0KCkpfTtpZihwPT09IioiKXtlPVtdO2Zvcih5IGluIGEpYS5oYXNPd25Qcm9wZXJ0eSh5KSYmZS5wdXNoKHkpO3JldHVybiB3PW8uX2F0dGFjaChlKSx3JiZUKCksb31yZXR1cm4oYS5sb2FkZXJ8fGFbImxvYWRlci1iYXNlIl0pJiYhby5Mb2FkZXImJm8uX2F0dGFjaChbImxvYWRlciIrKGEubG9hZGVyPyIiOiItYmFzZSIpXSksbSYmby5Mb2FkZXImJmUubGVuZ3RoJiYoaT1FKG8pLGkucmVxdWlyZShlKSxpLmlnbm9yZVJlZ2lzdGVyZWQ9ITAsaS5fYm9vdD0hMCxpLmNhbGN1bGF0ZShudWxsLFM/bnVsbDoianMiKSxlPWkuc29ydGVkLGkuX2Jvb3Q9ITEpLHgoZSkscj1nLmxlbmd0aCxyJiYoZz1kLmRlZHVwZShnKSxyPWcubGVuZ3RoKSxtJiZyJiZvLkxvYWRlcj8oby5fbG9hZGluZz0hMCxpPUUobyksaS5vbkVuZD1ULGkuY29udGV4dD1vLGkuZGF0YT1lLGkuaWdub3JlUmVnaXN0ZXJlZD0hMSxpLnJlcXVpcmUoZyksaS5pbnNlcnQobnVsbCxTP251bGw6ImpzIikpOm0mJnImJm8uR2V0JiYhZi5ib290c3RyYXBwZWQ/KG8uX2xvYWRpbmc9ITAscz1mdW5jdGlvbigpe28uX2xvYWRpbmc9ITEsaC5ydW5uaW5nPSExLGYuYm9vdHN0cmFwcGVkPSEwLHUuX2Jvb3RzdHJhcHBpbmc9ITEsby5fYXR0YWNoKFsibG9hZGVyIl0pJiZvLl91c2UoZSx0KX0sdS5fYm9vdHN0cmFwcGluZz9oLmFkZChzKToodS5fYm9vdHN0cmFwcGluZz0hMCxvLkdldC5zY3JpcHQodi5iYXNlK3YubG9hZGVyUGF0aCx7b25FbmQ6c30pKSk6KHc9by5fYXR0YWNoKGUpLHcmJlQoKSksb30sbmFtZXNwYWNlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLHQsbj0wLGkscyxvO2Zvcig7bjxlLmxlbmd0aDtuKyspe3Q9dGhpcyxvPWVbbl07aWYoby5pbmRleE9mKHIpPi0xKXtzPW8uc3BsaXQocik7Zm9yKGk9c1swXT09IllBSE9PIj8xOjA7aTxzLmxlbmd0aDtpKyspdFtzW2ldXT10W3NbaV1dfHx7fSx0PXRbc1tpXV19ZWxzZSB0W29dPXRbb118fHt9LHQ9dFtvXX1yZXR1cm4gdH0sbG9nOnUsbWVzc2FnZTp1LGR1bXA6ZnVuY3Rpb24oZSl7cmV0dXJuIiIrZX0sZXJyb3I6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMsaTtyLmNvbmZpZy5lcnJvckZuJiYoaT1yLmNvbmZpZy5lcnJvckZuLmFwcGx5KHIsYXJndW1lbnRzKSk7aWYoIWkpdGhyb3cgdHx8bmV3IEVycm9yKGUpO3JldHVybiByLm1lc3NhZ2UoZSwiZXJyb3IiLCIiK24pLHJ9LGd1aWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5FbnYuX2d1aWRwKyJfIisgKyt0aGlzLkVudi5fdWlkeDtyZXR1cm4gZT9lK3Q6dH0sc3RhbXA6ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZighZSlyZXR1cm4gZTtlLnVuaXF1ZUlEJiZlLm5vZGVUeXBlJiZlLm5vZGVUeXBlIT09OT9uPWUudW5pcXVlSUQ6bj10eXBlb2YgZT09InN0cmluZyI/ZTplLl95dWlkO2lmKCFuKXtuPXRoaXMuZ3VpZCgpO2lmKCF0KXRyeXtlLl95dWlkPW59Y2F0Y2gocil7bj1udWxsfX1yZXR1cm4gbn0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5FdmVudCYmZS5FdmVudC5fdW5sb2FkKCksZGVsZXRlIHZbZS5pZF0sZGVsZXRlIGUuRW52LGRlbGV0ZSBlLmNvbmZpZ319LFlVSS5wcm90b3R5cGU9ZTtmb3IodCBpbiBlKWUuaGFzT3duUHJvcGVydHkodCkmJihZVUlbdF09ZVt0XSk7WVVJLmFwcGx5Q29uZmlnPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybjtZVUkuR2xvYmFsQ29uZmlnJiZ0aGlzLnByb3RvdHlwZS5hcHBseUNvbmZpZy5jYWxsKHRoaXMsWVVJLkdsb2JhbENvbmZpZyksdGhpcy5wcm90b3R5cGUuYXBwbHlDb25maWcuY2FsbCh0aGlzLGUpLFlVSS5HbG9iYWxDb25maWc9dGhpcy5jb25maWd9LFlVSS5faW5pdCgpLGw/KGcoaCwiRE9NQ29udGVudExvYWRlZCIsYiksZyh3aW5kb3csImxvYWQiLHcpKTooYigpLHcoKSksWVVJLkVudi5hZGQ9ZyxZVUkuRW52LnJlbW92ZT15LHR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmKGV4cG9ydHMuWVVJPVlVSSxZVUkuc2V0TG9hZEhvb2s9ZnVuY3Rpb24oZSl7WVVJLl9nZXRMb2FkSG9vaz1lfSxZVUkuX2dldExvYWRIb29rPW51bGwpLFlVSS5FbnZbbl09e319KSgpLFlVSS5hZGQoInl1aS1iYXNlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG0oZSx0LG4pe3ZhciByLGk7dHx8KHQ9MCk7aWYobnx8bS50ZXN0KGUpKXRyeXtyZXR1cm4gZC5zbGljZS5jYWxsKGUsdCl9Y2F0Y2gocyl7aT1bXTtmb3Iocj1lLmxlbmd0aDt0PHI7Kyt0KWkucHVzaChlW3RdKTtyZXR1cm4gaX1yZXR1cm5bZV19ZnVuY3Rpb24gZygpe3RoaXMuX2luaXQoKSx0aGlzLmFkZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIG49ZS5MYW5nfHwoZS5MYW5nPXt9KSxyPVN0cmluZy5wcm90b3R5cGUsaT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHM9eyJ1bmRlZmluZWQiOiJ1bmRlZmluZWQiLG51bWJlcjoibnVtYmVyIiwiYm9vbGVhbiI6ImJvb2xlYW4iLHN0cmluZzoic3RyaW5nIiwiW29iamVjdCBGdW5jdGlvbl0iOiJmdW5jdGlvbiIsIltvYmplY3QgUmVnRXhwXSI6InJlZ2V4cCIsIltvYmplY3QgQXJyYXldIjoiYXJyYXkiLCJbb2JqZWN0IERhdGVdIjoiZGF0ZSIsIltvYmplY3QgRXJyb3JdIjoiZXJyb3IifSxvPS9ce1xzKihbXnx9XSs/KVxzKig/Olx8KFtefV0qKSk/XHMqXH0vZyx1PSIJXG4LXGZcciBcdTAwYTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMjhcdTIwMjlcdTIwMmZcdTIwNWZcdTMwMDBcdWZlZmYiLGE9IlsJLVxyIFx1MDBhMFx1MTY4MFx1MTgwZVx1MjAwMC1cdTIwMGFcdTIwMjhcdTIwMjlcdTIwMmZcdTIwNWZcdTMwMDBcdWZlZmZdKyIsZj1uZXcgUmVnRXhwKCJeIithKSxsPW5ldyBSZWdFeHAoYSsiJCIpLGM9bmV3IFJlZ0V4cChmLnNvdXJjZSsifCIrbC5zb3VyY2UsImciKSxoPS9ce1xzKlxbKD86bmF0aXZlIGNvZGV8ZnVuY3Rpb24pXF1ccypcfS9pO24uX2lzTmF0aXZlPWZ1bmN0aW9uKHQpe3JldHVybiEhKGUuY29uZmlnLnVzZU5hdGl2ZUVTNSYmdCYmaC50ZXN0KHQpKX0sbi5pc0FycmF5PW4uX2lzTmF0aXZlKEFycmF5LmlzQXJyYXkpP0FycmF5LmlzQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIG4udHlwZShlKT09PSJhcnJheSJ9LG4uaXNCb29sZWFuPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09ImJvb2xlYW4ifSxuLmlzRGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbi50eXBlKGUpPT09ImRhdGUiJiZlLnRvU3RyaW5nKCkhPT0iSW52YWxpZCBEYXRlIiYmIWlzTmFOKGUpfSxuLmlzRnVuY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuIG4udHlwZShlKT09PSJmdW5jdGlvbiJ9LG4uaXNOdWxsPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09bnVsbH0sbi5pc051bWJlcj1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJudW1iZXIiJiZpc0Zpbml0ZShlKX0sbi5pc09iamVjdD1mdW5jdGlvbihlLHQpe3ZhciByPXR5cGVvZiBlO3JldHVybiBlJiYocj09PSJvYmplY3QifHwhdCYmKHI9PT0iZnVuY3Rpb24ifHwKbi5pc0Z1bmN0aW9uKGUpKSl8fCExfSxuLmlzUmVnRXhwPWZ1bmN0aW9uKGUpe3JldHVybiBuLnR5cGUoZSk9PT0icmVnZXhwIn0sbi5pc1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmcifSxuLmlzVW5kZWZpbmVkPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09InVuZGVmaW5lZCJ9LG4uaXNWYWx1ZT1mdW5jdGlvbihlKXt2YXIgdD1uLnR5cGUoZSk7c3dpdGNoKHQpe2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUoZSk7Y2FzZSJudWxsIjpjYXNlInVuZGVmaW5lZCI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hIXR9fSxuLm5vdz1EYXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sbi5zdWI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5yZXBsYWNlP2UucmVwbGFjZShvLGZ1bmN0aW9uKGUscil7cmV0dXJuIG4uaXNVbmRlZmluZWQodFtyXSk/ZTp0W3JdfSk6ZX0sbi50cmltPW4uX2lzTmF0aXZlKHIudHJpbSkmJiF1LnRyaW0oKT9mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS50cmltP2UudHJpbSgpOmV9OmZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gZS5yZXBsYWNlKGMsIiIpfWNhdGNoKHQpe3JldHVybiBlfX0sbi50cmltTGVmdD1uLl9pc05hdGl2ZShyLnRyaW1MZWZ0KSYmIXUudHJpbUxlZnQoKT9mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltTGVmdCgpfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGYsIiIpfSxuLnRyaW1SaWdodD1uLl9pc05hdGl2ZShyLnRyaW1SaWdodCkmJiF1LnRyaW1SaWdodCgpP2Z1bmN0aW9uKGUpe3JldHVybiBlLnRyaW1SaWdodCgpfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGwsIiIpfSxuLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHNbdHlwZW9mIGVdfHxzW2kuY2FsbChlKV18fChlPyJvYmplY3QiOiJudWxsIil9O3ZhciBwPWUuTGFuZyxkPUFycmF5LnByb3RvdHlwZSx2PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZS5BcnJheT1tLG0uZGVkdXBlPXAuX2lzTmF0aXZlKE9iamVjdC5jcmVhdGUpP2Z1bmN0aW9uKGUpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCksbj1bXSxyLGkscztmb3Iocj0wLHM9ZS5sZW5ndGg7cjxzOysrcilpPWVbcl0sdFtpXXx8KHRbaV09MSxuLnB1c2goaSkpO3JldHVybiBufTpmdW5jdGlvbihlKXt2YXIgdD17fSxuPVtdLHIsaSxzO2ZvcihyPTAscz1lLmxlbmd0aDtyPHM7KytyKWk9ZVtyXSx2LmNhbGwodCxpKXx8KHRbaV09MSxuLnB1c2goaSkpO3JldHVybiBufSxtLmVhY2g9bS5mb3JFYWNoPXAuX2lzTmF0aXZlKGQuZm9yRWFjaCk/ZnVuY3Rpb24odCxuLHIpe3JldHVybiBkLmZvckVhY2guY2FsbCh0fHxbXSxuLHJ8fGUpLGV9OmZ1bmN0aW9uKHQsbixyKXtmb3IodmFyIGk9MCxzPXQmJnQubGVuZ3RofHwwO2k8czsrK2kpaSBpbiB0JiZuLmNhbGwocnx8ZSx0W2ldLGksdCk7cmV0dXJuIGV9LG0uaGFzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXt9LHI9dCYmdC5sZW5ndGh8fDAsaSxzO2ZvcihpPTAscz1lLmxlbmd0aDtpPHM7KytpKWkgaW4gZSYmKG5bZVtpXV09cj5pJiZpIGluIHQ/dFtpXTohMCk7cmV0dXJuIG59LG0uaW5kZXhPZj1wLl9pc05hdGl2ZShkLmluZGV4T2YpP2Z1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZC5pbmRleE9mLmNhbGwoZSx0LG4pfTpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5sZW5ndGg7bj0rbnx8MCxuPShuPjB8fC0xKSpNYXRoLmZsb29yKE1hdGguYWJzKG4pKSxuPDAmJihuKz1yLG48MCYmKG49MCkpO2Zvcig7bjxyOysrbilpZihuIGluIGUmJmVbbl09PT10KXJldHVybiBuO3JldHVybi0xfSxtLm51bWVyaWNTb3J0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0sbS5zb21lPXAuX2lzTmF0aXZlKGQuc29tZSk/ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBkLnNvbWUuY2FsbChlLHQsbil9OmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPWUubGVuZ3RoO3I8aTsrK3IpaWYociBpbiBlJiZ0LmNhbGwobixlW3JdLHIsZSkpcmV0dXJuITA7cmV0dXJuITF9LG0udGVzdD1mdW5jdGlvbihlKXt2YXIgdD0wO2lmKHAuaXNBcnJheShlKSl0PTE7ZWxzZSBpZihwLmlzT2JqZWN0KGUpKXRyeXsibGVuZ3RoImluIGUmJiFlLnRhZ05hbWUmJighZS5zY3JvbGxUb3x8IWUuZG9jdW1lbnQpJiYhZS5hcHBseSYmKHQ9Mil9Y2F0Y2gobil7fXJldHVybiB0fSxnLnByb3RvdHlwZT17X2luaXQ6ZnVuY3Rpb24oKXt0aGlzLl9xPVtdfSxuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Euc2hpZnQoKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9xLnBvcCgpfSxhZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcS5wdXNoLmFwcGx5KHRoaXMuX3EsYXJndW1lbnRzKSx0aGlzfSxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3EubGVuZ3RofX0sZS5RdWV1ZT1nLFlVSS5FbnYuX2xvYWRlclF1ZXVlPVlVSS5FbnYuX2xvYWRlclF1ZXVlfHxuZXcgZzt2YXIgeT0iX18iLHY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxiPWUuTGFuZy5pc09iamVjdDtlLmNhY2hlZD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHR8fCh0PXt9KSxmdW5jdGlvbihyKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjE/QXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMseSk6U3RyaW5nKHIpO2lmKCEoaSBpbiB0KXx8biYmdFtpXT09bil0W2ldPWUuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiB0W2ldfX0sZS5nZXRMb2NhdGlvbj1mdW5jdGlvbigpe3ZhciB0PWUuY29uZmlnLndpbjtyZXR1cm4gdCYmdC5sb2NhdGlvbn0sZS5tZXJnZT1mdW5jdGlvbigpe3ZhciBlPTAsdD1hcmd1bWVudHMubGVuZ3RoLG49e30scixpO2Zvcig7ZTx0OysrZSl7aT1hcmd1bWVudHNbZV07Zm9yKHIgaW4gaSl2LmNhbGwoaSxyKSYmKG5bcl09aVtyXSl9cmV0dXJuIG59LGUubWl4PWZ1bmN0aW9uKHQsbixyLGkscyxvKXt2YXIgdSxhLGYsbCxjLGgscDtpZighdHx8IW4pcmV0dXJuIHR8fGU7aWYocyl7cz09PTImJmUubWl4KHQucHJvdG90eXBlLG4ucHJvdG90eXBlLHIsaSwwLG8pLGY9cz09PTF8fHM9PT0zP24ucHJvdG90eXBlOm4scD1zPT09MXx8cz09PTQ/dC5wcm90b3R5cGU6dDtpZighZnx8IXApcmV0dXJuIHR9ZWxzZSBmPW4scD10O3U9ciYmIW87aWYoaSlmb3IobD0wLGg9aS5sZW5ndGg7bDxoOysrbCl7Yz1pW2xdO2lmKCF2LmNhbGwoZixjKSljb250aW51ZTthPXU/ITE6YyBpbiBwO2lmKG8mJmEmJmIocFtjXSwhMCkmJmIoZltjXSwhMCkpZS5taXgocFtjXSxmW2NdLHIsbnVsbCwwLG8pO2Vsc2UgaWYocnx8IWEpcFtjXT1mW2NdfWVsc2V7Zm9yKGMgaW4gZil7aWYoIXYuY2FsbChmLGMpKWNvbnRpbnVlO2E9dT8hMTpjIGluIHA7aWYobyYmYSYmYihwW2NdLCEwKSYmYihmW2NdLCEwKSllLm1peChwW2NdLGZbY10scixudWxsLDAsbyk7ZWxzZSBpZihyfHwhYSlwW2NdPWZbY119ZS5PYmplY3QuX2hhc0VudW1CdWcmJmUubWl4KHAsZixyLGUuT2JqZWN0Ll9mb3JjZUVudW0scyxvKX1yZXR1cm4gdH07dmFyIHA9ZS5MYW5nLHY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx3LEU9ZS5PYmplY3Q9cC5faXNOYXRpdmUoT2JqZWN0LmNyZWF0ZSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5jcmVhdGUoZSl9OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucHJvdG90eXBlPXQsbmV3IGV9fSgpLFM9RS5fZm9yY2VFbnVtPVsiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJ0b1N0cmluZyIsInRvTG9jYWxlU3RyaW5nIiwidmFsdWVPZiJdLHg9RS5faGFzRW51bUJ1Zz0he3ZhbHVlT2Y6MH0ucHJvcGVydHlJc0VudW1lcmFibGUoInZhbHVlT2YiKSxUPUUuX2hhc1Byb3RvRW51bUJ1Zz1mdW5jdGlvbigpe30ucHJvcGVydHlJc0VudW1lcmFibGUoInByb3RvdHlwZSIpLE49RS5vd25zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuISFlJiZ2LmNhbGwoZSx0KX07RS5oYXNLZXk9TixFLmtleXM9cC5faXNOYXRpdmUoT2JqZWN0LmtleXMpJiYhVD9PYmplY3Qua2V5czpmdW5jdGlvbihlKXtpZighcC5pc09iamVjdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Iik7dmFyIHQ9W10sbixyLGk7aWYoVCYmdHlwZW9mIGU9PSJmdW5jdGlvbiIpZm9yKHIgaW4gZSlOKGUscikmJnIhPT0icHJvdG90eXBlIiYmdC5wdXNoKHIpO2Vsc2UgZm9yKHIgaW4gZSlOKGUscikmJnQucHVzaChyKTtpZih4KWZvcihuPTAsaT1TLmxlbmd0aDtuPGk7KytuKXI9U1tuXSxOKGUscikmJnQucHVzaChyKTtyZXR1cm4gdH0sRS52YWx1ZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9RS5rZXlzKGUpLG49MCxyPXQubGVuZ3RoLGk9W107Zm9yKDtuPHI7KytuKWkucHVzaChlW3Rbbl1dKTtyZXR1cm4gaX0sRS5zaXplPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gRS5rZXlzKGUpLmxlbmd0aH1jYXRjaCh0KXtyZXR1cm4gMH19LEUuaGFzVmFsdWU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5BcnJheS5pbmRleE9mKEUudmFsdWVzKHQpLG4pPi0xfSxFLmVhY2g9ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM7Zm9yKHMgaW4gdCkoaXx8Tih0LHMpKSYmbi5jYWxsKHJ8fGUsdFtzXSxzLHQpO3JldHVybiBlfSxFLnNvbWU9ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM7Zm9yKHMgaW4gdClpZihpfHxOKHQscykpaWYobi5jYWxsKHJ8fGUsdFtzXSxzLHQpKXJldHVybiEwO3JldHVybiExfSxFLmdldFZhbHVlPWZ1bmN0aW9uKHQsbil7aWYoIXAuaXNPYmplY3QodCkpcmV0dXJuIHc7dmFyIHIsaT1lLkFycmF5KG4pLHM9aS5sZW5ndGg7Zm9yKHI9MDt0IT09dyYmcjxzO3IrKyl0PXRbaVtyXV07cmV0dXJuIHR9LEUuc2V0VmFsdWU9ZnVuY3Rpb24odCxuLHIpe3ZhciBpLHM9ZS5BcnJheShuKSxvPXMubGVuZ3RoLTEsdT10O2lmKG8+PTApe2ZvcihpPTA7dSE9PXcmJmk8bztpKyspdT11W3NbaV1dO2lmKHU9PT13KXJldHVybiB3O3Vbc1tpXV09cn1yZXR1cm4gdH0sRS5pc0VtcHR5PWZ1bmN0aW9uKGUpe3JldHVybiFFLmtleXMoT2JqZWN0KGUpKS5sZW5ndGh9LFlVSS5FbnYucGFyc2VVQT1mdW5jdGlvbih0KXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD0wO3JldHVybiBwYXJzZUZsb2F0KGUucmVwbGFjZSgvXC4vZyxmdW5jdGlvbigpe3JldHVybiB0Kys9PT0xPyIiOiIuIn0pKX0scj1lLmNvbmZpZy53aW4saT1yJiZyLm5hdmlnYXRvcixzPXtpZTowLG9wZXJhOjAsZ2Vja286MCx3ZWJraXQ6MCxzYWZhcmk6MCxjaHJvbWU6MCxtb2JpbGU6bnVsbCxhaXI6MCxwaGFudG9tanM6MCxpcGFkOjAsaXBob25lOjAsaXBvZDowLGlvczpudWxsLGFuZHJvaWQ6MCxzaWxrOjAsdWJ1bnR1OjAsYWNjZWw6ITEsd2Vib3M6MCxjYWphOmkmJmkuY2FqYVZlcnNpb24sc2VjdXJlOiExLG9zOm51bGwsbm9kZWpzOjAsd2luanM6dHlwZW9mIFdpbmRvd3MhPSJ1bmRlZmluZWQiJiYhIVdpbmRvd3MuU3lzdGVtLHRvdWNoRW5hYmxlZDohMX0sbz10fHxpJiZpLnVzZXJBZ2VudCx1PXImJnIubG9jYXRpb24sYT11JiZ1LmhyZWYsZjtyZXR1cm4gcy51c2VyQWdlbnQ9byxzLnNlY3VyZT1hJiZhLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHMiKT09PTAsbyYmKC93aW5kb3dzfHdpbjMyL2kudGVzdChvKT9zLm9zPSJ3aW5kb3dzIjovbWFjaW50b3NofG1hY19wb3dlcnBjL2kudGVzdChvKT9zLm9zPSJtYWNpbnRvc2giOi9hbmRyb2lkL2kudGVzdChvKT9zLm9zPSJhbmRyb2lkIjovc3ltYm9zL2kudGVzdChvKT9zLm9zPSJzeW1ib3MiOi9saW51eC9pLnRlc3Qobyk/cy5vcz0ibGludXgiOi9yaGluby9pLnRlc3QobykmJihzLm9zPSJyaGlubyIpLC9LSFRNTC8udGVzdChvKSYmKHMud2Via2l0PTEpLC9JRU1vYmlsZXxYQkxXUDcvLnRlc3QobykmJihzLm1vYmlsZT0id2luZG93cyIpLC9GZW5uZWMvLnRlc3QobykmJihzLm1vYmlsZT0iZ2Vja28iKSxmPW8ubWF0Y2goL0FwcGxlV2ViS2l0XC8oW15cc10qKS8pLGYmJmZbMV0mJihzLgp3ZWJraXQ9bihmWzFdKSxzLnNhZmFyaT1zLndlYmtpdCwvUGhhbnRvbUpTLy50ZXN0KG8pJiYoZj1vLm1hdGNoKC9QaGFudG9tSlNcLyhbXlxzXSopLyksZiYmZlsxXSYmKHMucGhhbnRvbWpzPW4oZlsxXSkpKSwvIE1vYmlsZVwvLy50ZXN0KG8pfHwvaVBhZHxpUG9kfGlQaG9uZS8udGVzdChvKT8ocy5tb2JpbGU9IkFwcGxlIixmPW8ubWF0Y2goL09TIChbXlxzXSopLyksZiYmZlsxXSYmKGY9bihmWzFdLnJlcGxhY2UoIl8iLCIuIikpKSxzLmlvcz1mLHMub3M9ImlvcyIscy5pcGFkPXMuaXBvZD1zLmlwaG9uZT0wLGY9by5tYXRjaCgvaVBhZHxpUG9kfGlQaG9uZS8pLGYmJmZbMF0mJihzW2ZbMF0udG9Mb3dlckNhc2UoKV09cy5pb3MpKTooZj1vLm1hdGNoKC9Ob2tpYU5bXlwvXSp8d2ViT1NcL1xkXC5cZC8pLGYmJihzLm1vYmlsZT1mWzBdKSwvd2ViT1MvLnRlc3QobykmJihzLm1vYmlsZT0iV2ViT1MiLGY9by5tYXRjaCgvd2ViT1NcLyhbXlxzXSopOy8pLGYmJmZbMV0mJihzLndlYm9zPW4oZlsxXSkpKSwvIEFuZHJvaWQvLnRlc3QobykmJigvTW9iaWxlLy50ZXN0KG8pJiYocy5tb2JpbGU9IkFuZHJvaWQiKSxmPW8ubWF0Y2goL0FuZHJvaWQgKFteXHNdKik7LyksZiYmZlsxXSYmKHMuYW5kcm9pZD1uKGZbMV0pKSksL1NpbGsvLnRlc3QobykmJihmPW8ubWF0Y2goL1NpbGtcLyhbXlxzXSopLyksZiYmZlsxXSYmKHMuc2lsaz1uKGZbMV0pKSxzLmFuZHJvaWR8fChzLmFuZHJvaWQ9Mi4zNCxzLm9zPSJBbmRyb2lkIiksL0FjY2VsZXJhdGVkPXRydWUvLnRlc3QobykmJihzLmFjY2VsPSEwKSkpLGY9by5tYXRjaCgvT1BSXC8oXGQrXC5cZCspLyksZiYmZlsxXT9zLm9wZXJhPW4oZlsxXSk6KGY9by5tYXRjaCgvKENocm9tZXxDck1vfENyaU9TKVwvKFteXHNdKikvKSxmJiZmWzFdJiZmWzJdPyhzLmNocm9tZT1uKGZbMl0pLHMuc2FmYXJpPTAsZlsxXT09PSJDck1vIiYmKHMubW9iaWxlPSJjaHJvbWUiKSk6KGY9by5tYXRjaCgvQWRvYmVBSVJcLyhbXlxzXSopLyksZiYmKHMuYWlyPWZbMF0pKSkpLGY9by5tYXRjaCgvVWJ1bnR1XCAoXGQrXC5cZCspLyksZiYmZlsxXSYmKHMub3M9ImxpbnV4IixzLnVidW50dT1uKGZbMV0pLGY9by5tYXRjaCgvXCBXZWJLaXRcLyhbXlxzXSopLyksZiYmZlsxXSYmKHMud2Via2l0PW4oZlsxXSkpLGY9by5tYXRjaCgvXCBDaHJvbWl1bVwvKFteXHNdKikvKSxmJiZmWzFdJiYocy5jaHJvbWU9bihmWzFdKSksLyBNb2JpbGUkLy50ZXN0KG8pJiYocy5tb2JpbGU9IlVidW50dSIpKSxzLndlYmtpdHx8KC9PcGVyYS8udGVzdChvKT8oZj1vLm1hdGNoKC9PcGVyYVtcc1wvXShbXlxzXSopLyksZiYmZlsxXSYmKHMub3BlcmE9bihmWzFdKSksZj1vLm1hdGNoKC9WZXJzaW9uXC8oW15cc10qKS8pLGYmJmZbMV0mJihzLm9wZXJhPW4oZlsxXSkpLC9PcGVyYSBNb2JpLy50ZXN0KG8pJiYocy5tb2JpbGU9Im9wZXJhIixmPW8ucmVwbGFjZSgiT3BlcmEgTW9iaSIsIiIpLm1hdGNoKC9PcGVyYSAoW15cc10qKS8pLGYmJmZbMV0mJihzLm9wZXJhPW4oZlsxXSkpKSxmPW8ubWF0Y2goL09wZXJhIE1pbmlbXjtdKi8pLGYmJihzLm1vYmlsZT1mWzBdKSk6KGY9by5tYXRjaCgvTVNJRSAoW147XSopfFRyaWRlbnQuKjsgcnY6KFswLTkuXSspLyksZiYmKGZbMV18fGZbMl0pP3MuaWU9bihmWzFdfHxmWzJdKTooZj1vLm1hdGNoKC9HZWNrb1wvKFteXHNdKikvKSxmJiYocy5nZWNrbz0xLGY9by5tYXRjaCgvcnY6KFteXHNcKV0qKS8pLGYmJmZbMV0mJihzLmdlY2tvPW4oZlsxXSksL01vYmlsZXxUYWJsZXQvLnRlc3QobykmJihzLm1vYmlsZT0iZmZvcyIpKSkpKSkpLHImJmkmJiEocy5jaHJvbWUmJnMuY2hyb21lPDYpJiYocy50b3VjaEVuYWJsZWQ9Im9udG91Y2hzdGFydCJpbiByfHwibXNNYXhUb3VjaFBvaW50cyJpbiBpJiZpLm1zTWF4VG91Y2hQb2ludHM+MCksdHx8KHR5cGVvZiBwcm9jZXNzPT0ib2JqZWN0IiYmcHJvY2Vzcy52ZXJzaW9ucyYmcHJvY2Vzcy52ZXJzaW9ucy5ub2RlJiYocy5vcz1wcm9jZXNzLnBsYXRmb3JtLHMubm9kZWpzPW4ocHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSksWVVJLkVudi5VQT1zKSxzfSxlLlVBPVlVSS5FbnYuVUF8fFlVSS5FbnYucGFyc2VVQSgpLGUuVUEuY29tcGFyZVZlcnNpb25zPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbyx1O2lmKGU9PT10KXJldHVybiAwO3I9KGUrIiIpLnNwbGl0KCIuIikscz0odCsiIikuc3BsaXQoIi4iKTtmb3Iobz0wLHU9TWF0aC5tYXgoci5sZW5ndGgscy5sZW5ndGgpO288dTsrK28pe249cGFyc2VJbnQocltvXSwxMCksaT1wYXJzZUludChzW29dLDEwKSxpc05hTihuKSYmKG49MCksaXNOYU4oaSkmJihpPTApO2lmKG48aSlyZXR1cm4tMTtpZihuPmkpcmV0dXJuIDF9cmV0dXJuIDB9LFlVSS5FbnYuYWxpYXNlcz17YW5pbTpbImFuaW0tYmFzZSIsImFuaW0tY29sb3IiLCJhbmltLWN1cnZlIiwiYW5pbS1lYXNpbmciLCJhbmltLW5vZGUtcGx1Z2luIiwiYW5pbS1zY3JvbGwiLCJhbmltLXh5Il0sImFuaW0tc2hhcGUtdHJhbnNmb3JtIjpbImFuaW0tc2hhcGUiXSxhcHA6WyJhcHAtYmFzZSIsImFwcC1jb250ZW50IiwiYXBwLXRyYW5zaXRpb25zIiwibGF6eS1tb2RlbC1saXN0IiwibW9kZWwiLCJtb2RlbC1saXN0IiwibW9kZWwtc3luYy1yZXN0IiwibW9kZWwtc3luYy1sb2NhbCIsInJvdXRlciIsInZpZXciLCJ2aWV3LW5vZGUtbWFwIl0sYXR0cmlidXRlOlsiYXR0cmlidXRlLWJhc2UiLCJhdHRyaWJ1dGUtY29tcGxleCJdLCJhdHRyaWJ1dGUtZXZlbnRzIjpbImF0dHJpYnV0ZS1vYnNlcnZhYmxlIl0sYXV0b2NvbXBsZXRlOlsiYXV0b2NvbXBsZXRlLWJhc2UiLCJhdXRvY29tcGxldGUtc291cmNlcyIsImF1dG9jb21wbGV0ZS1saXN0IiwiYXV0b2NvbXBsZXRlLXBsdWdpbiJdLGF4ZXM6WyJheGlzLW51bWVyaWMiLCJheGlzLWNhdGVnb3J5IiwiYXhpcy10aW1lIiwiYXhpcy1zdGFja2VkIl0sImF4ZXMtYmFzZSI6WyJheGlzLW51bWVyaWMtYmFzZSIsImF4aXMtY2F0ZWdvcnktYmFzZSIsImF4aXMtdGltZS1iYXNlIiwiYXhpcy1zdGFja2VkLWJhc2UiXSxiYXNlOlsiYmFzZS1iYXNlIiwiYmFzZS1wbHVnaW5ob3N0IiwiYmFzZS1idWlsZCJdLGNhY2hlOlsiY2FjaGUtYmFzZSIsImNhY2hlLW9mZmxpbmUiLCJjYWNoZS1wbHVnaW4iXSxjaGFydHM6WyJjaGFydHMtYmFzZSJdLGNvbGxlY3Rpb246WyJhcnJheS1leHRyYXMiLCJhcnJheWxpc3QiLCJhcnJheWxpc3QtYWRkIiwiYXJyYXlsaXN0LWZpbHRlciIsImFycmF5LWludm9rZSJdLGNvbG9yOlsiY29sb3ItYmFzZSIsImNvbG9yLWhzbCIsImNvbG9yLWhhcm1vbnkiXSxjb250cm9sbGVyOlsicm91dGVyIl0sZGF0YXNjaGVtYTpbImRhdGFzY2hlbWEtYmFzZSIsImRhdGFzY2hlbWEtanNvbiIsImRhdGFzY2hlbWEteG1sIiwiZGF0YXNjaGVtYS1hcnJheSIsImRhdGFzY2hlbWEtdGV4dCJdLGRhdGFzb3VyY2U6WyJkYXRhc291cmNlLWxvY2FsIiwiZGF0YXNvdXJjZS1pbyIsImRhdGFzb3VyY2UtZ2V0IiwiZGF0YXNvdXJjZS1mdW5jdGlvbiIsImRhdGFzb3VyY2UtY2FjaGUiLCJkYXRhc291cmNlLWpzb25zY2hlbWEiLCJkYXRhc291cmNlLXhtbHNjaGVtYSIsImRhdGFzb3VyY2UtYXJyYXlzY2hlbWEiLCJkYXRhc291cmNlLXRleHRzY2hlbWEiLCJkYXRhc291cmNlLXBvbGxpbmciXSxkYXRhdGFibGU6WyJkYXRhdGFibGUtY29yZSIsImRhdGF0YWJsZS10YWJsZSIsImRhdGF0YWJsZS1oZWFkIiwiZGF0YXRhYmxlLWJvZHkiLCJkYXRhdGFibGUtYmFzZSIsImRhdGF0YWJsZS1jb2x1bW4td2lkdGhzIiwiZGF0YXRhYmxlLW1lc3NhZ2UiLCJkYXRhdGFibGUtbXV0YWJsZSIsImRhdGF0YWJsZS1zb3J0IiwiZGF0YXRhYmxlLWRhdGFzb3VyY2UiXSxkYXRhdHlwZTpbImRhdGF0eXBlLWRhdGUiLCJkYXRhdHlwZS1udW1iZXIiLCJkYXRhdHlwZS14bWwiXSwiZGF0YXR5cGUtZGF0ZSI6WyJkYXRhdHlwZS1kYXRlLXBhcnNlIiwiZGF0YXR5cGUtZGF0ZS1mb3JtYXQiLCJkYXRhdHlwZS1kYXRlLW1hdGgiXSwiZGF0YXR5cGUtbnVtYmVyIjpbImRhdGF0eXBlLW51bWJlci1wYXJzZSIsImRhdGF0eXBlLW51bWJlci1mb3JtYXQiXSwiZGF0YXR5cGUteG1sIjpbImRhdGF0eXBlLXhtbC1wYXJzZSIsImRhdGF0eXBlLXhtbC1mb3JtYXQiXSxkZDpbImRkLWRkbS1iYXNlIiwiZGQtZGRtIiwiZGQtZGRtLWRyb3AiLCJkZC1kcmFnIiwiZGQtcHJveHkiLCJkZC1jb25zdHJhaW4iLCJkZC1kcm9wIiwiZGQtc2Nyb2xsIiwiZGQtZGVsZWdhdGUiXSxkb206WyJkb20tYmFzZSIsImRvbS1zY3JlZW4iLCJkb20tc3R5bGUiLCJzZWxlY3Rvci1uYXRpdmUiLCJzZWxlY3RvciJdLGVkaXRvcjpbImZyYW1lIiwiZWRpdG9yLXNlbGVjdGlvbiIsImV4ZWMtY29tbWFuZCIsImVkaXRvci1iYXNlIiwiZWRpdG9yLXBhcmEiLCJlZGl0b3ItYnIiLCJlZGl0b3ItYmlkaSIsImVkaXRvci10YWIiLCJjcmVhdGVsaW5rLWJhc2UiXSxldmVudDpbImV2ZW50LWJhc2UiLCJldmVudC1kZWxlZ2F0ZSIsImV2ZW50LXN5bnRoZXRpYyIsImV2ZW50LW1vdXNld2hlZWwiLCJldmVudC1tb3VzZWVudGVyIiwiZXZlbnQta2V5IiwiZXZlbnQtZm9jdXMiLCJldmVudC1yZXNpemUiLCJldmVudC1ob3ZlciIsImV2ZW50LW91dHNpZGUiLCJldmVudC10b3VjaCIsImV2ZW50LW1vdmUiLCJldmVudC1mbGljayIsImV2ZW50LXZhbHVlY2hhbmdlIiwiZXZlbnQtdGFwIl0sImV2ZW50LWN1c3RvbSI6WyJldmVudC1jdXN0b20tYmFzZSIsImV2ZW50LWN1c3RvbS1jb21wbGV4Il0sImV2ZW50LWdlc3R1cmVzIjpbImV2ZW50LWZsaWNrIiwiZXZlbnQtbW92ZSJdLGhhbmRsZWJhcnM6WyJoYW5kbGViYXJzLWNvbXBpbGVyIl0saGlnaGxpZ2h0OlsiaGlnaGxpZ2h0LWJhc2UiLCJoaWdobGlnaHQtYWNjZW50Zm9sZCJdLGhpc3Rvcnk6WyJoaXN0b3J5LWJhc2UiLCJoaXN0b3J5LWhhc2giLCJoaXN0b3J5LWh0bWw1Il0saW86WyJpby1iYXNlIiwiaW8teGRyIiwiaW8tZm9ybSIsImlvLXVwbG9hZC1pZnJhbWUiLCJpby1xdWV1ZSJdLGpzb246WyJqc29uLXBhcnNlIiwianNvbi1zdHJpbmdpZnkiXSxsb2FkZXI6WyJsb2FkZXItYmFzZSIsImxvYWRlci1yb2xsdXAiLCJsb2FkZXIteXVpMyJdLG5vZGU6WyJub2RlLWJhc2UiLCJub2RlLWV2ZW50LWRlbGVnYXRlIiwibm9kZS1wbHVnaW5ob3N0Iiwibm9kZS1zY3JlZW4iLCJub2RlLXN0eWxlIl0scGx1Z2luaG9zdDpbInBsdWdpbmhvc3QtYmFzZSIsInBsdWdpbmhvc3QtY29uZmlnIl0scXVlcnlzdHJpbmc6WyJxdWVyeXN0cmluZy1wYXJzZSIsInF1ZXJ5c3RyaW5nLXN0cmluZ2lmeSJdLHJlY29yZHNldDpbInJlY29yZHNldC1iYXNlIiwicmVjb3Jkc2V0LXNvcnQiLCJyZWNvcmRzZXQtZmlsdGVyIiwicmVjb3Jkc2V0LWluZGV4ZXIiXSxyZXNpemU6WyJyZXNpemUtYmFzZSIsInJlc2l6ZS1wcm94eSIsInJlc2l6ZS1jb25zdHJhaW4iXSxzbGlkZXI6WyJzbGlkZXItYmFzZSIsInNsaWRlci12YWx1ZS1yYW5nZSIsImNsaWNrYWJsZS1yYWlsIiwicmFuZ2Utc2xpZGVyIl0sdGVtcGxhdGU6WyJ0ZW1wbGF0ZS1iYXNlIiwidGVtcGxhdGUtbWljcm8iXSx0ZXh0OlsidGV4dC1hY2NlbnRmb2xkIiwidGV4dC13b3JkYnJlYWsiXSx3aWRnZXQ6WyJ3aWRnZXQtYmFzZSIsIndpZGdldC1odG1scGFyc2VyIiwid2lkZ2V0LXNraW4iLCJ3aWRnZXQtdWlldmVudHMiXX19LCIzLjE3LjIiLHt1c2U6WyJ5dWktYmFzZSIsImdldCIsImZlYXR1cmVzIiwiaW50bC1iYXNlIiwieXVpLWxvZyIsInl1aS1sYXRlciIsImxvYWRlci1iYXNlIiwibG9hZGVyLXJvbGx1cCIsImxvYWRlci15dWkzIl19KSxZVUkuYWRkKCJnZXQiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5MYW5nLHIsaSxzO2UuR2V0PWk9e2Nzc09wdGlvbnM6e2F0dHJpYnV0ZXM6e3JlbDoic3R5bGVzaGVldCJ9LGRvYzplLmNvbmZpZy5saW5rRG9jfHxlLmNvbmZpZy5kb2MscG9sbEludGVydmFsOjUwfSxqc09wdGlvbnM6e2F1dG9wdXJnZTohMCxkb2M6ZS5jb25maWcuc2NyaXB0RG9jfHxlLmNvbmZpZy5kb2N9LG9wdGlvbnMKOnthdHRyaWJ1dGVzOntjaGFyc2V0OiJ1dGYtOCJ9LHB1cmdldGhyZXNob2xkOjIwfSxSRUdFWF9DU1M6L1wuY3NzKD86Wz87XS4qKT8kL2ksUkVHRVhfSlM6L1wuanMoPzpbPztdLiopPyQvaSxfaW5zZXJ0Q2FjaGU6e30sX3BlbmRpbmc6bnVsbCxfcHVyZ2VOb2RlczpbXSxfcXVldWU6W10sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGkscztpZighZS5hYm9ydCl7bj1lLHM9dGhpcy5fcGVuZGluZyxlPW51bGw7aWYocyYmcy50cmFuc2FjdGlvbi5pZD09PW4pZT1zLnRyYW5zYWN0aW9uLHRoaXMuX3BlbmRpbmc9bnVsbDtlbHNlIGZvcih0PTAsaT10aGlzLl9xdWV1ZS5sZW5ndGg7dDxpOysrdCl7cj10aGlzLl9xdWV1ZVt0XS50cmFuc2FjdGlvbjtpZihyLmlkPT09bil7ZT1yLHRoaXMuX3F1ZXVlLnNwbGljZSh0LDEpO2JyZWFrfX19ZSYmZS5hYm9ydCgpfSxjc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLl9sb2FkKCJjc3MiLGUsdCxuKX0sanM6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLl9sb2FkKCJqcyIsZSx0LG4pfSxsb2FkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fbG9hZChudWxsLGUsdCxuKX0sX2F1dG9QdXJnZTpmdW5jdGlvbihlKXtlJiZ0aGlzLl9wdXJnZU5vZGVzLmxlbmd0aD49ZSYmdGhpcy5fcHVyZ2UodGhpcy5fcHVyZ2VOb2Rlcyl9LF9nZXRFbnY6ZnVuY3Rpb24oKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj1lLlVBO3JldHVybiB0aGlzLl9lbnY9e2FzeW5jOnQmJnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IikuYXN5bmM9PT0hMHx8bi5pZT49MTAsY3NzRmFpbDpuLmdlY2tvPj05fHxuLmNvbXBhcmVWZXJzaW9ucyhuLndlYmtpdCw1MzUuMjQpPj0wLGNzc0xvYWQ6KCFuLmdlY2tvJiYhbi53ZWJraXR8fG4uZ2Vja28+PTl8fG4uY29tcGFyZVZlcnNpb25zKG4ud2Via2l0LDUzNS4yNCk+PTApJiYhKG4uY2hyb21lJiZuLmNocm9tZTw9MTgpLHByZXNlcnZlc1NjcmlwdE9yZGVyOiEhKG4uZ2Vja298fG4ub3BlcmF8fG4uaWUmJm4uaWU+PTEwKX19LF9nZXRUcmFuc2FjdGlvbjpmdW5jdGlvbih0LHIpe3ZhciBpPVtdLG8sdSxhLGY7bi5pc0FycmF5KHQpfHwodD1bdF0pLHI9ZS5tZXJnZSh0aGlzLm9wdGlvbnMsciksci5hdHRyaWJ1dGVzPWUubWVyZ2UodGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMsci5hdHRyaWJ1dGVzKTtmb3Iobz0wLHU9dC5sZW5ndGg7bzx1Oysrbyl7Zj10W29dLGE9e2F0dHJpYnV0ZXM6e319O2lmKHR5cGVvZiBmPT0ic3RyaW5nIilhLnVybD1mO2Vsc2V7aWYoIWYudXJsKWNvbnRpbnVlO2UubWl4KGEsZiwhMSxudWxsLDAsITApLGY9Zi51cmx9ZS5taXgoYSxyLCExLG51bGwsMCwhMCksYS50eXBlfHwodGhpcy5SRUdFWF9DU1MudGVzdChmKT9hLnR5cGU9ImNzcyI6KCF0aGlzLlJFR0VYX0pTLnRlc3QoZiksYS50eXBlPSJqcyIpKSxlLm1peChhLGEudHlwZT09PSJqcyI/dGhpcy5qc09wdGlvbnM6dGhpcy5jc3NPcHRpb25zLCExLG51bGwsMCwhMCksYS5hdHRyaWJ1dGVzLmlkfHwoYS5hdHRyaWJ1dGVzLmlkPWUuZ3VpZCgpKSxhLndpbj9hLmRvYz1hLndpbi5kb2N1bWVudDphLndpbj1hLmRvYy5kZWZhdWx0Vmlld3x8YS5kb2MucGFyZW50V2luZG93LGEuY2hhcnNldCYmKGEuYXR0cmlidXRlcy5jaGFyc2V0PWEuY2hhcnNldCksaS5wdXNoKGEpfXJldHVybiBuZXcgcyhpLHIpfSxfbG9hZDpmdW5jdGlvbihlLHQsbixyKXt2YXIgcztyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiImJihyPW4sbj17fSksbnx8KG49e30pLG4udHlwZT1lLG4uX29uRmluaXNoPWkuX29uVHJhbnNhY3Rpb25GaW5pc2gsdGhpcy5fZW52fHx0aGlzLl9nZXRFbnYoKSxzPXRoaXMuX2dldFRyYW5zYWN0aW9uKHQsbiksdGhpcy5fcXVldWUucHVzaCh7Y2FsbGJhY2s6cix0cmFuc2FjdGlvbjpzfSksdGhpcy5fbmV4dCgpLHN9LF9vblRyYW5zYWN0aW9uRmluaXNoOmZ1bmN0aW9uKCl7aS5fcGVuZGluZz1udWxsLGkuX25leHQoKX0sX25leHQ6ZnVuY3Rpb24oKXt2YXIgZTtpZih0aGlzLl9wZW5kaW5nKXJldHVybjtlPXRoaXMuX3F1ZXVlLnNoaWZ0KCksZSYmKHRoaXMuX3BlbmRpbmc9ZSxlLnRyYW5zYWN0aW9uLmV4ZWN1dGUoZS5jYWxsYmFjaykpfSxfcHVyZ2U6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fcHVyZ2VOb2RlcyxyPXQhPT1uLGksczt3aGlsZShzPXQucG9wKCkpe2lmKCFzLl95dWlnZXRfZmluaXNoZWQpY29udGludWU7cy5wYXJlbnROb2RlJiZzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocyksciYmKGk9ZS5BcnJheS5pbmRleE9mKG4scyksaT4tMSYmbi5zcGxpY2UoaSwxKSl9fX0saS5zY3JpcHQ9aS5qcyxpLlRyYW5zYWN0aW9uPXM9ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzO3IuaWQ9cy5fbGFzdElkKz0xLHIuZGF0YT1uLmRhdGEsci5lcnJvcnM9W10sci5ub2Rlcz1bXSxyLm9wdGlvbnM9bixyLnJlcXVlc3RzPXQsci5fY2FsbGJhY2tzPVtdLHIuX3F1ZXVlPVtdLHIuX3JlcXNXYWl0aW5nPTAsci50SWQ9ci5pZCxyLndpbj1uLndpbnx8ZS5jb25maWcud2lufSxzLl9sYXN0SWQ9MCxzLnByb3RvdHlwZT17X3N0YXRlOiJuZXciLGFib3J0OmZ1bmN0aW9uKGUpe3RoaXMuX3BlbmRpbmc9bnVsbCx0aGlzLl9wZW5kaW5nQ1NTPW51bGwsdGhpcy5fcG9sbFRpbWVyPWNsZWFyVGltZW91dCh0aGlzLl9wb2xsVGltZXIpLHRoaXMuX3F1ZXVlPVtdLHRoaXMuX3JlcXNXYWl0aW5nPTAsdGhpcy5lcnJvcnMucHVzaCh7ZXJyb3I6ZXx8IkFib3J0ZWQifSksdGhpcy5fZmluaXNoKCl9LGV4ZWN1dGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXQucmVxdWVzdHMscj10Ll9zdGF0ZSxpLHMsbyx1O2lmKHI9PT0iZG9uZSIpe2UmJmUodC5lcnJvcnMubGVuZ3RoP3QuZXJyb3JzOm51bGwsdCk7cmV0dXJufWUmJnQuX2NhbGxiYWNrcy5wdXNoKGUpO2lmKHI9PT0iZXhlY3V0aW5nIilyZXR1cm47dC5fc3RhdGU9ImV4ZWN1dGluZyIsdC5fcXVldWU9bz1bXSx0Lm9wdGlvbnMudGltZW91dCYmKHQuX3RpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3QuYWJvcnQoIlRpbWVvdXQiKX0sdC5vcHRpb25zLnRpbWVvdXQpKSx0Ll9yZXFzV2FpdGluZz1uLmxlbmd0aDtmb3IoaT0wLHM9bi5sZW5ndGg7aTxzOysraSl1PW5baV0sdS5hc3luY3x8dS50eXBlPT09ImNzcyI/dC5faW5zZXJ0KHUpOm8ucHVzaCh1KTt0Ll9uZXh0KCl9LHB1cmdlOmZ1bmN0aW9uKCl7aS5fcHVyZ2UodGhpcy5ub2Rlcyl9LF9jcmVhdGVOb2RlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1uLmNyZWF0ZUVsZW1lbnQoZSkscyxvO3J8fChvPW4uY3JlYXRlRWxlbWVudCgiZGl2Iiksby5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiYSIpLHI9by5jbGFzc05hbWU9PT0iYSI/e306eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifSk7Zm9yKHMgaW4gdCl0Lmhhc093blByb3BlcnR5KHMpJiZpLnNldEF0dHJpYnV0ZShyW3NdfHxzLHRbc10pO3JldHVybiBpfSxfZmluaXNoOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lcnJvcnMubGVuZ3RoP3RoaXMuZXJyb3JzOm51bGwsdD10aGlzLm9wdGlvbnMsbj10LmNvbnRleHR8fHRoaXMscixpLHM7aWYodGhpcy5fc3RhdGU9PT0iZG9uZSIpcmV0dXJuO3RoaXMuX3N0YXRlPSJkb25lIjtmb3IoaT0wLHM9dGhpcy5fY2FsbGJhY2tzLmxlbmd0aDtpPHM7KytpKXRoaXMuX2NhbGxiYWNrc1tpXS5jYWxsKG4sZSx0aGlzKTtyPXRoaXMuX2dldEV2ZW50RGF0YSgpLGU/KHQub25UaW1lb3V0JiZlW2UubGVuZ3RoLTFdLmVycm9yPT09IlRpbWVvdXQiJiZ0Lm9uVGltZW91dC5jYWxsKG4sciksdC5vbkZhaWx1cmUmJnQub25GYWlsdXJlLmNhbGwobixyKSk6dC5vblN1Y2Nlc3MmJnQub25TdWNjZXNzLmNhbGwobixyKSx0Lm9uRW5kJiZ0Lm9uRW5kLmNhbGwobixyKSx0Ll9vbkZpbmlzaCYmdC5fb25GaW5pc2goKX0sX2dldEV2ZW50RGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gdD9lLm1lcmdlKHRoaXMse2Fib3J0OnRoaXMuYWJvcnQscHVyZ2U6dGhpcy5wdXJnZSxyZXF1ZXN0OnQsdXJsOnQudXJsLHdpbjp0Lndpbn0pOnRoaXN9LF9nZXRJbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCl7dmFyIG49dC5kb2Mscj10Lmluc2VydEJlZm9yZSxzLG87cmV0dXJuIHI/dHlwZW9mIHI9PSJzdHJpbmciP24uZ2V0RWxlbWVudEJ5SWQocik6cjoocz1pLl9pbnNlcnRDYWNoZSxvPWUuc3RhbXAobiksKHI9c1tvXSk/cjoocj1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIilbMF0pP3Nbb109cjoocj1uLmhlYWR8fG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSxyPyhyLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoIiIpKSxzW29dPXIubGFzdENoaWxkKTpzW29dPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpWzBdKSl9LF9pbnNlcnQ6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gYygpe3UuX3Byb2dyZXNzKCJGYWlsZWQgdG8gbG9hZCAiK3QudXJsLHQpfWZ1bmN0aW9uIGgoKXtmJiZjbGVhclRpbWVvdXQoZiksdS5fcHJvZ3Jlc3MobnVsbCx0KX12YXIgbj1pLl9lbnYscj10aGlzLl9nZXRJbnNlcnRCZWZvcmUodCkscz10LnR5cGU9PT0ianMiLG89dC5ub2RlLHU9dGhpcyxhPWUuVUEsZixsO298fChzP2w9InNjcmlwdCI6IW4uY3NzTG9hZCYmYS5nZWNrbz9sPSJzdHlsZSI6bD0ibGluayIsbz10Lm5vZGU9dGhpcy5fY3JlYXRlTm9kZShsLHQuYXR0cmlidXRlcyx0LmRvYykpLHM/KG8uc2V0QXR0cmlidXRlKCJzcmMiLHQudXJsKSx0LmFzeW5jP28uYXN5bmM9ITA6KG4uYXN5bmMmJihvLmFzeW5jPSExKSxuLnByZXNlcnZlc1NjcmlwdE9yZGVyfHwodGhpcy5fcGVuZGluZz10KSkpOiFuLmNzc0xvYWQmJmEuZ2Vja28/by5pbm5lckhUTUw9KHQuYXR0cmlidXRlcy5jaGFyc2V0PydAY2hhcnNldCAiJyt0LmF0dHJpYnV0ZXMuY2hhcnNldCsnIjsnOiIiKSsnQGltcG9ydCAiJyt0LnVybCsnIjsnOm8uc2V0QXR0cmlidXRlKCJocmVmIix0LnVybCkscyYmYS5pZSYmKGEuaWU8OXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlJiZkb2N1bWVudC5kb2N1bWVudE1vZGU8OSk/by5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXsvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KG8ucmVhZHlTdGF0ZSkmJihvLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGgoKSl9OiFzJiYhbi5jc3NMb2FkP3RoaXMuX3BvbGwodCk6KGEuaWU+PTEwPyhvLm9uZXJyb3I9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGMsMCl9LG8ub25sb2FkPWZ1bmN0aW9uKCl7c2V0VGltZW91dChoLDApfSk6KG8ub25lcnJvcj1jLG8ub25sb2FkPWgpLCFuLmNzc0ZhaWwmJiFzJiYoZj1zZXRUaW1lb3V0KGMsdC50aW1lb3V0fHwzZTMpKSksdGhpcy5ub2Rlcy5wdXNoKG8pLHIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobyxyKX0sX25leHQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9wZW5kaW5nKXJldHVybjt0aGlzLl9xdWV1ZS5sZW5ndGg/dGhpcy5faW5zZXJ0KHRoaXMuX3F1ZXVlLnNoaWZ0KCkpOnRoaXMuX3JlcXNXYWl0aW5nfHx0aGlzLl9maW5pc2goKX0sX3BvbGw6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPW4uX3BlbmRpbmdDU1MsaT1lLlVBLndlYmtpdCxzLG8sdSxhLGYsbDtpZih0KXtyfHwocj1uLl9wZW5kaW5nQ1NTPVtdKSxyLnB1c2godCk7aWYobi5fcG9sbFRpbWVyKXJldHVybn1uLl9wb2xsVGltZXI9bnVsbDtmb3Iocz0wO3M8ci5sZW5ndGg7KytzKXtmPXJbc107aWYoaSl7bD1mLmRvYy5zdHlsZVNoZWV0cyx1PWwubGVuZ3RoLGE9Zi5ub2RlLmhyZWY7d2hpbGUoLS11Pj0wKWlmKGxbdV0uaHJlZj09PWEpe3Iuc3BsaWNlKHMsMSkscy09MSxuLl9wcm9ncmVzcyhudWxsLGYpO2JyZWFrfX1lbHNlIHRyeXtvPSEhZi5ub2RlLnNoZWV0LmNzc1J1bGVzLHIuc3BsaWNlKHMsMSkscy09MSxuLl9wcm9ncmVzcyhudWxsLGYpfWNhdGNoKGMpe319ci5sZW5ndGgmJihuLl9wb2xsVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe24uX3BvbGwuY2FsbChuKX0sbi5vcHRpb25zLnBvbGxJbnRlcnZhbCkpfSxfcHJvZ3Jlc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm9wdGlvbnMKO2UmJih0LmVycm9yPWUsdGhpcy5lcnJvcnMucHVzaCh7ZXJyb3I6ZSxyZXF1ZXN0OnR9KSksdC5ub2RlLl95dWlnZXRfZmluaXNoZWQ9dC5maW5pc2hlZD0hMCxuLm9uUHJvZ3Jlc3MmJm4ub25Qcm9ncmVzcy5jYWxsKG4uY29udGV4dHx8dGhpcyx0aGlzLl9nZXRFdmVudERhdGEodCkpLHQuYXV0b3B1cmdlJiYoaS5fYXV0b1B1cmdlKHRoaXMub3B0aW9ucy5wdXJnZXRocmVzaG9sZCksaS5fcHVyZ2VOb2Rlcy5wdXNoKHQubm9kZSkpLHRoaXMuX3BlbmRpbmc9PT10JiYodGhpcy5fcGVuZGluZz1udWxsKSx0aGlzLl9yZXFzV2FpdGluZy09MSx0aGlzLl9uZXh0KCl9fX0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pLFlVSS5hZGQoImZlYXR1cmVzIixmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2UubWl4KGUubmFtZXNwYWNlKCJGZWF0dXJlcyIpLHt0ZXN0czpuLGFkZDpmdW5jdGlvbihlLHQscil7bltlXT1uW2VdfHx7fSxuW2VdW3RdPXJ9LGFsbDpmdW5jdGlvbih0LHIpe3ZhciBpPW5bdF0scz1bXTtyZXR1cm4gaSYmZS5PYmplY3QuZWFjaChpLGZ1bmN0aW9uKG4saSl7cy5wdXNoKGkrIjoiKyhlLkZlYXR1cmVzLnRlc3QodCxpLHIpPzE6MCkpfSkscy5sZW5ndGg/cy5qb2luKCI7Iik6IiJ9LHRlc3Q6ZnVuY3Rpb24odCxyLGkpe2k9aXx8W107dmFyIHMsbyx1LGE9blt0XSxmPWEmJmFbcl07cmV0dXJuIWZ8fChzPWYucmVzdWx0LGUuTGFuZy5pc1VuZGVmaW5lZChzKSYmKG89Zi51YSxvJiYocz1lLlVBW29dKSx1PWYudGVzdCx1JiYoIW98fHMpJiYocz11LmFwcGx5KGUsaSkpLGYucmVzdWx0PXMpKSxzfX0pO3ZhciByPWUuRmVhdHVyZXMuYWRkO3IoImxvYWQiLCIwIix7bmFtZToiYXBwLXRyYW5zaXRpb25zLW5hdGl2ZSIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10P3QuZG9jdW1lbnRFbGVtZW50Om51bGw7cmV0dXJuIG4mJm4uc3R5bGU/Ik1velRyYW5zaXRpb24iaW4gbi5zdHlsZXx8IldlYmtpdFRyYW5zaXRpb24iaW4gbi5zdHlsZXx8InRyYW5zaXRpb24iaW4gbi5zdHlsZTohMX0sdHJpZ2dlcjoiYXBwLXRyYW5zaXRpb25zIn0pLHIoImxvYWQiLCIxIix7bmFtZToiYXV0b2NvbXBsZXRlLWxpc3Qta2V5cyIsdGVzdDpmdW5jdGlvbihlKXtyZXR1cm4hZS5VQS5pb3MmJiFlLlVBLmFuZHJvaWR9LHRyaWdnZXI6ImF1dG9jb21wbGV0ZS1saXN0In0pLHIoImxvYWQiLCIyIix7bmFtZToiZGQtZ2VzdHVyZXMiLHRyaWdnZXI6ImRkLWRyYWciLHVhOiJ0b3VjaEVuYWJsZWQifSkscigibG9hZCIsIjMiLHtuYW1lOiJkb20tc3R5bGUtaWUiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5GZWF0dXJlcy50ZXN0LG49ZS5GZWF0dXJlcy5hZGQscj1lLmNvbmZpZy53aW4saT1lLmNvbmZpZy5kb2Mscz0iZG9jdW1lbnRFbGVtZW50IixvPSExO3JldHVybiBuKCJzdHlsZSIsImNvbXB1dGVkU3R5bGUiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHImJiJnZXRDb21wdXRlZFN0eWxlImluIHJ9fSksbigic3R5bGUiLCJvcGFjaXR5Iix7dGVzdDpmdW5jdGlvbigpe3JldHVybiBpJiYib3BhY2l0eSJpbiBpW3NdLnN0eWxlfX0pLG89IXQoInN0eWxlIiwib3BhY2l0eSIpJiYhdCgic3R5bGUiLCJjb21wdXRlZFN0eWxlIiksb30sdHJpZ2dlcjoiZG9tLXN0eWxlIn0pLHIoImxvYWQiLCI0Iix7bmFtZToiZWRpdG9yLXBhcmEtaWUiLHRyaWdnZXI6ImVkaXRvci1wYXJhIix1YToiaWUiLHdoZW46Imluc3RlYWQifSkscigibG9hZCIsIjUiLHtuYW1lOiJldmVudC1iYXNlLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmltcGxlbWVudGF0aW9uO3JldHVybiB0JiYhdC5oYXNGZWF0dXJlKCJFdmVudHMiLCIyLjAiKX0sdHJpZ2dlcjoibm9kZS1iYXNlIn0pLHIoImxvYWQiLCI2Iix7bmFtZToiZ3JhcGhpY3MtY2FudmFzIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lJiZlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZT09ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuKCFpfHxuKSYmciYmci5nZXRDb250ZXh0JiZyLmdldENvbnRleHQoIjJkIil9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCI3Iix7bmFtZToiZ3JhcGhpY3MtY2FudmFzLWRlZmF1bHQiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49ZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmUmJmUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lPT0iY2FudmFzIixyPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT10JiZ0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKTtyZXR1cm4oIWl8fG4pJiZyJiZyLmdldENvbnRleHQmJnIuZ2V0Q29udGV4dCgiMmQiKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSkscigibG9hZCIsIjgiLHtuYW1lOiJncmFwaGljcy1zdmciLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49IWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lfHxlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZSE9ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuIGkmJihufHwhcil9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCI5Iix7bmFtZToiZ3JhcGhpY3Mtc3ZnLWRlZmF1bHQiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49IWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lfHxlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZSE9ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuIGkmJihufHwhcil9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCIxMCIse25hbWU6ImdyYXBoaWNzLXZtbCIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3JldHVybiB0JiYhdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIikmJighbnx8IW4uZ2V0Q29udGV4dHx8IW4uZ2V0Q29udGV4dCgiMmQiKSl9LHRyaWdnZXI6ImdyYXBoaWNzIn0pLHIoImxvYWQiLCIxMSIse25hbWU6ImdyYXBoaWNzLXZtbC1kZWZhdWx0Iix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJuIHQmJiF0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKSYmKCFufHwhbi5nZXRDb250ZXh0fHwhbi5nZXRDb250ZXh0KCIyZCIpKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSkscigibG9hZCIsIjEyIix7bmFtZToiaGlzdG9yeS1oYXNoLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmRvY3VtZW50TW9kZTtyZXR1cm4gZS5VQS5pZSYmKCEoIm9uaGFzaGNoYW5nZSJpbiBlLmNvbmZpZy53aW4pfHwhdHx8dDw4KX0sdHJpZ2dlcjoiaGlzdG9yeS1oYXNoIn0pLHIoImxvYWQiLCIxMyIse25hbWU6ImlvLW5vZGVqcyIsdHJpZ2dlcjoiaW8tYmFzZSIsdWE6Im5vZGVqcyJ9KSxyKCJsb2FkIiwiMTQiLHtuYW1lOiJqc29uLXBhcnNlLXNoaW0iLHRlc3Q6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gaShlLHQpe3JldHVybiBlPT09Im9rIj8hMDp0fXZhciB0PWUuY29uZmlnLmdsb2JhbC5KU09OLG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgSlNPTl0iJiZ0LHI9ZS5jb25maWcudXNlTmF0aXZlSlNPTlBhcnNlIT09ITEmJiEhbjtpZihyKXRyeXtyPW4ucGFyc2UoJ3sib2siOmZhbHNlfScsaSkub2t9Y2F0Y2gocyl7cj0hMX1yZXR1cm4hcn0sdHJpZ2dlcjoianNvbi1wYXJzZSJ9KSxyKCJsb2FkIiwiMTUiLHtuYW1lOiJqc29uLXN0cmluZ2lmeS1zaGltIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmdsb2JhbC5KU09OLG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgSlNPTl0iJiZ0LHI9ZS5jb25maWcudXNlTmF0aXZlSlNPTlN0cmluZ2lmeSE9PSExJiYhIW47aWYocil0cnl7cj0iMCI9PT1uLnN0cmluZ2lmeSgwKX1jYXRjaChpKXtyPSExfXJldHVybiFyfSx0cmlnZ2VyOiJqc29uLXN0cmluZ2lmeSJ9KSxyKCJsb2FkIiwiMTYiLHtuYW1lOiJzY3JvbGx2aWV3LWJhc2UtaWUiLHRyaWdnZXI6InNjcm9sbHZpZXctYmFzZSIsdWE6ImllIn0pLHIoImxvYWQiLCIxNyIse25hbWU6InNlbGVjdG9yLWNzczIiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49dCYmISgicXVlcnlTZWxlY3RvckFsbCJpbiB0KTtyZXR1cm4gbn0sdHJpZ2dlcjoic2VsZWN0b3IifSkscigibG9hZCIsIjE4Iix7bmFtZToidHJhbnNpdGlvbi10aW1lciIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10P3QuZG9jdW1lbnRFbGVtZW50Om51bGwscj0hMDtyZXR1cm4gbiYmbi5zdHlsZSYmKHI9ISgiTW96VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwiV2Via2l0VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwidHJhbnNpdGlvbiJpbiBuLnN0eWxlKSkscn0sdHJpZ2dlcjoidHJhbnNpdGlvbiJ9KSxyKCJsb2FkIiwiMTkiLHtuYW1lOiJ3aWRnZXQtYmFzZS1pZSIsdHJpZ2dlcjoid2lkZ2V0LWJhc2UiLHVhOiJpZSJ9KSxyKCJsb2FkIiwiMjAiLHtuYW1lOiJ5cWwtanNvbnAiLHRlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIWUuVUEubm9kZWpzJiYhZS5VQS53aW5qc30sdHJpZ2dlcjoieXFsIn0pLHIoImxvYWQiLCIyMSIse25hbWU6InlxbC1ub2RlanMiLHRyaWdnZXI6InlxbCIsdWE6Im5vZGVqcyJ9KSxyKCJsb2FkIiwiMjIiLHtuYW1lOiJ5cWwtd2luanMiLHRyaWdnZXI6InlxbCIsdWE6IndpbmpzIn0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSksWVVJLmFkZCgiaW50bC1iYXNlIixmdW5jdGlvbihlLHQpe3ZhciBuPS9bLCBdLztlLm1peChlLm5hbWVzcGFjZSgiSW50bCIpLHtsb29rdXBCZXN0TGFuZzpmdW5jdGlvbih0LHIpe2Z1bmN0aW9uIGEoZSl7dmFyIHQ7Zm9yKHQ9MDt0PHIubGVuZ3RoO3QrPTEpaWYoZS50b0xvd2VyQ2FzZSgpPT09clt0XS50b0xvd2VyQ2FzZSgpKXJldHVybiByW3RdfXZhciBpLHMsbyx1O2UuTGFuZy5pc1N0cmluZyh0KSYmKHQ9dC5zcGxpdChuKSk7Zm9yKGk9MDtpPHQubGVuZ3RoO2krPTEpe3M9dFtpXTtpZighc3x8cz09PSIqIiljb250aW51ZTt3aGlsZShzLmxlbmd0aD4wKXtvPWEocyk7aWYobylyZXR1cm4gbzt1PXMubGFzdEluZGV4T2YoIi0iKTtpZighKHU+PTApKWJyZWFrO3M9cy5zdWJzdHJpbmcoMCx1KSx1Pj0yJiZzLmNoYXJBdCh1LTIpPT09Ii0iJiYocz1zLnN1YnN0cmluZygwLHUtMikpfX1yZXR1cm4iIn19KX0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pLFlVSS5hZGQoInl1aS1sb2ciLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZSxyPSJ5dWk6bG9nIixpPSJ1bmRlZmluZWQiLHM9e2RlYnVnOjEsaW5mbzoyLHdhcm46NCxlcnJvcjo4fTtuLmxvZz1mdW5jdGlvbihlLHQsbyx1KXt2YXIgYSxmLGwsYyxoLHAsZD1uLHY9ZC5jb25maWcsbT1kLmZpcmU/ZDpZVUkuRW52Ci5nbG9iYWxFdmVudHM7cmV0dXJuIHYuZGVidWcmJihvPW98fCIiLHR5cGVvZiBvIT0idW5kZWZpbmVkIiYmKGY9di5sb2dFeGNsdWRlLGw9di5sb2dJbmNsdWRlLCFsfHxvIGluIGw/bCYmbyBpbiBsP2E9IWxbb106ZiYmbyBpbiBmJiYoYT1mW29dKTphPTEsdHlwZW9mIHQ9PSJ1bmRlZmluZWQiJiYodD0iaW5mbyIpLGQuY29uZmlnLmxvZ0xldmVsPWQuY29uZmlnLmxvZ0xldmVsfHwiZGVidWciLHA9c1tkLmNvbmZpZy5sb2dMZXZlbC50b0xvd2VyQ2FzZSgpXSx0IGluIHMmJnNbdF08cCYmKGE9MSkpLGF8fCh2LnVzZUJyb3dzZXJDb25zb2xlJiYoYz1vP28rIjogIitlOmUsZC5MYW5nLmlzRnVuY3Rpb24odi5sb2dGbik/di5sb2dGbi5jYWxsKGQsZSx0LG8pOnR5cGVvZiBjb25zb2xlIT09aSYmY29uc29sZS5sb2c/KGg9dCYmY29uc29sZVt0XSYmdCBpbiBzP3Q6ImxvZyIsY29uc29sZVtoXShjKSk6dHlwZW9mIG9wZXJhIT09aSYmb3BlcmEucG9zdEVycm9yKGMpKSxtJiYhdSYmKG09PT1kJiYhbS5nZXRFdmVudChyKSYmbS5wdWJsaXNoKHIse2Jyb2FkY2FzdDoyfSksbS5maXJlKHIse21zZzplLGNhdDp0LHNyYzpvfSkpKSksZH0sbi5tZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIG4ubG9nLmFwcGx5KG4sYXJndW1lbnRzKX19LCIzLjE3LjIiLHtyZXF1aXJlczpbInl1aS1iYXNlIl19KSxZVUkuYWRkKCJ5dWktbGF0ZXIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49W107ZS5sYXRlcj1mdW5jdGlvbih0LHIsaSxzLG8pe3Q9dHx8MCxzPWUuTGFuZy5pc1VuZGVmaW5lZChzKT9uOmUuQXJyYXkocykscj1yfHxlLmNvbmZpZy53aW58fGU7dmFyIHU9ITEsYT1yJiZlLkxhbmcuaXNTdHJpbmcoaSk/cltpXTppLGY9ZnVuY3Rpb24oKXt1fHwoYS5hcHBseT9hLmFwcGx5KHIsc3x8bik6YShzWzBdLHNbMV0sc1syXSxzWzNdKSl9LGw9bz9zZXRJbnRlcnZhbChmLHQpOnNldFRpbWVvdXQoZix0KTtyZXR1cm57aWQ6bCxpbnRlcnZhbDpvLGNhbmNlbDpmdW5jdGlvbigpe3U9ITAsdGhpcy5pbnRlcnZhbD9jbGVhckludGVydmFsKGwpOmNsZWFyVGltZW91dChsKX19fSxlLkxhbmcubGF0ZXI9ZS5sYXRlcn0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pLFlVSS5hZGQoImxvYWRlci1iYXNlIixmdW5jdGlvbihlLHQpeyhmdW5jdGlvbigpe3ZhciB0PWUudmVyc2lvbixuPSIvYnVpbGQvIixyPXQrIi8iLGk9ZS5FbnYuYmFzZSxzPSJnYWxsZXJ5LTIwMTQuMDUuMjktMTUtNDYiLG89IjJpbjMiLHU9IjQiLGE9IjIuOS4wIixmPWkrImNvbWJvPyIsbD17dmVyc2lvbjp0LHJvb3Q6cixiYXNlOmUuRW52LmJhc2UsY29tYm9CYXNlOmYsc2tpbjp7ZGVmYXVsdFNraW46InNhbSIsYmFzZToiYXNzZXRzL3NraW5zLyIscGF0aDoic2tpbi5jc3MiLGFmdGVyOlsiY3NzcmVzZXQiLCJjc3Nmb250cyIsImNzc2dyaWRzIiwiY3NzYmFzZSIsImNzc3Jlc2V0LWNvbnRleHQiLCJjc3Nmb250cy1jb250ZXh0Il19LGdyb3Vwczp7fSxwYXR0ZXJuczp7fX0sYz1sLmdyb3VwcyxoPWZ1bmN0aW9uKGUsdCxyKXt2YXIgcz1vKyIuIisoZXx8dSkrIi8iKyh0fHxhKStuLGw9ciYmci5iYXNlP3IuYmFzZTppLGg9ciYmci5jb21ib0Jhc2U/ci5jb21ib0Jhc2U6ZjtjLnl1aTIuYmFzZT1sK3MsYy55dWkyLnJvb3Q9cyxjLnl1aTIuY29tYm9CYXNlPWh9LHA9ZnVuY3Rpb24oZSx0KXt2YXIgcj0oZXx8cykrbixvPXQmJnQuYmFzZT90LmJhc2U6aSx1PXQmJnQuY29tYm9CYXNlP3QuY29tYm9CYXNlOmY7Yy5nYWxsZXJ5LmJhc2U9bytyLGMuZ2FsbGVyeS5yb290PXIsYy5nYWxsZXJ5LmNvbWJvQmFzZT11fTtjW3RdPXt9LGMuZ2FsbGVyeT17ZXh0OiExLGNvbWJpbmU6ITAsY29tYm9CYXNlOmYsdXBkYXRlOnAscGF0dGVybnM6eyJnYWxsZXJ5LSI6e30sImxhbmcvZ2FsbGVyeS0iOnt9LCJnYWxsZXJ5Y3NzLSI6e3R5cGU6ImNzcyJ9fX0sYy55dWkyPXtjb21iaW5lOiEwLGV4dDohMSxjb21ib0Jhc2U6Zix1cGRhdGU6aCxwYXR0ZXJuczp7Inl1aTItIjp7Y29uZmlnRm46ZnVuY3Rpb24oZSl7Ly1za2lufHJlc2V0fGZvbnRzfGdyaWRzfGJhc2UvLnRlc3QoZS5uYW1lKSYmKGUudHlwZT0iY3NzIixlLnBhdGg9ZS5wYXRoLnJlcGxhY2UoL1wuanMvLCIuY3NzIiksZS5wYXRoPWUucGF0aC5yZXBsYWNlKC9cL3l1aTItc2tpbi8sIi9hc3NldHMvc2tpbnMvc2FtL3l1aTItc2tpbiIpKX19fX0scCgpLGgoKSxZVUkuRW52W3RdJiZlLm1peChsLFlVSS5FbnZbdF0sITEsWyJtb2R1bGVzIiwiZ3JvdXBzIiwic2tpbiJdLDAsITApLFlVSS5FbnZbdF09bH0pKCk7dmFyIG49e30scj1bXSxpPTEwMjQscz1ZVUkuRW52LG89cy5fbG9hZGVkLHU9ImNzcyIsYT0ianMiLGY9ImludGwiLGw9InNhbSIsYz1lLnZlcnNpb24saD0iIixwPWUuT2JqZWN0LGQ9cC5lYWNoLHY9ZS5BcnJheSxtPXMuX2xvYWRlclF1ZXVlLGc9c1tjXSx5PSJza2luLSIsYj1lLkxhbmcsdz1zLm1vZHMsRSxTPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUrIi8iK3Q7cmV0dXJuIHJ8fChpKz0iLW1pbiIpLGkrPSIuIisobnx8dSksaX07WVVJLkVudi5fY3NzTG9hZGVkfHwoWVVJLkVudi5fY3NzTG9hZGVkPXt9KSxlLkVudi5tZXRhPWcsZS5Mb2FkZXI9ZnVuY3Rpb24odCl7dmFyIG49dGhpczt0PXR8fHt9LEU9Zy5tZDUsbi5jb250ZXh0PWUsdC5kb0JlZm9yZUxvYWRlciYmdC5kb0JlZm9yZUxvYWRlci5hcHBseShuLGFyZ3VtZW50cyksbi5iYXNlPWUuRW52Lm1ldGEuYmFzZStlLkVudi5tZXRhLnJvb3Qsbi5jb21ib0Jhc2U9ZS5FbnYubWV0YS5jb21ib0Jhc2Usbi5jb21iaW5lPXQuYmFzZSYmdC5iYXNlLmluZGV4T2Yobi5jb21ib0Jhc2Uuc3Vic3RyKDAsMjApKT4tMSxuLmNvbWJvU2VwPSImIixuLm1heFVSTExlbmd0aD1pLG4uaWdub3JlUmVnaXN0ZXJlZD10Lmlnbm9yZVJlZ2lzdGVyZWQsbi5yb290PWUuRW52Lm1ldGEucm9vdCxuLnRpbWVvdXQ9MCxuLmZvcmNlTWFwPXt9LG4uYWxsb3dSb2xsdXA9ITEsbi5maWx0ZXJzPXt9LG4ucmVxdWlyZWQ9e30sbi5wYXR0ZXJucz17fSxuLm1vZHVsZUluZm89e30sbi5ncm91cHM9ZS5tZXJnZShlLkVudi5tZXRhLmdyb3Vwcyksbi5za2luPWUubWVyZ2UoZS5FbnYubWV0YS5za2luKSxuLmNvbmRpdGlvbnM9e30sbi5jb25maWc9dCxuLl9pbnRlcm5hbD0hMCxuLl9wb3B1bGF0ZUNvbmRpdGlvbnNDYWNoZSgpLG4ubG9hZGVkPW9bY10sbi5hc3luYz0hMCxuLl9pbnNwZWN0UGFnZSgpLG4uX2ludGVybmFsPSExLG4uX2NvbmZpZyh0KSxuLmZvcmNlTWFwPW4uZm9yY2U/ZS5BcnJheS5oYXNoKG4uZm9yY2UpOnt9LG4udGVzdHJlc3VsdHM9bnVsbCxlLmNvbmZpZy50ZXN0cyYmKG4udGVzdHJlc3VsdHM9ZS5jb25maWcudGVzdHMpLG4uc29ydGVkPVtdLG4uZGlydHk9ITAsbi5pbnNlcnRlZD17fSxuLnNraXBwZWQ9e30sbi50ZXN0ZWQ9e30sbi5pZ25vcmVSZWdpc3RlcmVkJiZuLl9yZXNldE1vZHVsZXMoKX0sZS5Mb2FkZXIucHJvdG90eXBlPXtnZXRNb2R1bGVJbmZvOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMubW9kdWxlSW5mb1t0XSxyLGksbyxhO3JldHVybiBuP246KHI9Zy5tb2R1bGVzLGk9cy5fcmVuZGVyZWRNb2RzLG89dGhpcy5faW50ZXJuYWwsaSYmaS5oYXNPd25Qcm9wZXJ0eSh0KSYmIXRoaXMuaWdub3JlUmVnaXN0ZXJlZD90aGlzLm1vZHVsZUluZm9bdF09ZS5tZXJnZShpW3RdKTpyLmhhc093blByb3BlcnR5KHQpJiYodGhpcy5faW50ZXJuYWw9ITAsYT10aGlzLmFkZE1vZHVsZShyW3RdLHQpLGEmJmEudHlwZT09PXUmJnRoaXMuaXNDU1NMb2FkZWQoYS5uYW1lLCEwKSYmKHRoaXMubG9hZGVkW2EubmFtZV09ITApLHRoaXMuX2ludGVybmFsPW8pLHRoaXMubW9kdWxlSW5mb1t0XSl9LF9leHBhbmRBbGlhc2VzOmZ1bmN0aW9uKHQpe3ZhciBuPVtdLHI9WVVJLkVudi5hbGlhc2VzLGksczt0PWUuQXJyYXkodCk7Zm9yKGk9MDtpPHQubGVuZ3RoO2krPTEpcz10W2ldLG4ucHVzaC5hcHBseShuLHJbc10/cltzXTpbc10pO3JldHVybiBufSxfcG9wdWxhdGVDb25kaXRpb25zQ2FjaGU6ZnVuY3Rpb24oKXt2YXIgdD1nLm1vZHVsZXMsbj1zLl9jb25kaXRpb25zLHIsaSxvLHU7aWYobiYmIXRoaXMuaWdub3JlUmVnaXN0ZXJlZClmb3IociBpbiBuKW4uaGFzT3duUHJvcGVydHkocikmJih0aGlzLmNvbmRpdGlvbnNbcl09ZS5tZXJnZShuW3JdKSk7ZWxzZXtmb3IociBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocikmJnRbcl0uY29uZGl0aW9uKXtvPXRoaXMuX2V4cGFuZEFsaWFzZXModFtyXS5jb25kaXRpb24udHJpZ2dlcik7Zm9yKGk9MDtpPG8ubGVuZ3RoO2krPTEpdT1vW2ldLHRoaXMuY29uZGl0aW9uc1t1XT10aGlzLmNvbmRpdGlvbnNbdV18fHt9LHRoaXMuY29uZGl0aW9uc1t1XVt0W3JdLm5hbWV8fHJdPXRbcl0uY29uZGl0aW9ufXMuX2NvbmRpdGlvbnM9dGhpcy5jb25kaXRpb25zfX0sX3Jlc2V0TW9kdWxlczpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdCxuLHIsaSxzO2Zvcih0IGluIGUubW9kdWxlSW5mbylpZihlLm1vZHVsZUluZm8uaGFzT3duUHJvcGVydHkodCkmJmUubW9kdWxlSW5mb1t0XSl7cj1lLm1vZHVsZUluZm9bdF0saT1yLm5hbWUscz1ZVUkuRW52Lm1vZHNbaV0/WVVJLkVudi5tb2RzW2ldLmRldGFpbHM6bnVsbCxzJiYoZS5tb2R1bGVJbmZvW2ldLl9yZXNldD0hMCxlLm1vZHVsZUluZm9baV0ucmVxdWlyZXM9cy5yZXF1aXJlc3x8W10sZS5tb2R1bGVJbmZvW2ldLm9wdGlvbmFsPXMub3B0aW9uYWx8fFtdLGUubW9kdWxlSW5mb1tpXS5zdXBlcnNlZGVzPXMuc3VwZXJjZWRlc3x8W10pO2lmKHIuZGVmYXVsdHMpZm9yKG4gaW4gci5kZWZhdWx0cylyLmRlZmF1bHRzLmhhc093blByb3BlcnR5KG4pJiZyW25dJiYocltuXT1yLmRlZmF1bHRzW25dKTtyLmxhbmdDYWNoZT11bmRlZmluZWQsci5za2luQ2FjaGU9dW5kZWZpbmVkLHIuc2tpbm5hYmxlJiZlLl9hZGRTa2luKGUuc2tpbi5kZWZhdWx0U2tpbixyLm5hbWUpfX0sUkVHRVhfQ1NTOi9cLmNzcyg/Ols/O10uKik/JC9pLEZJTFRFUl9ERUZTOntSQVc6e3NlYXJjaEV4cDoiLW1pblxcLmpzIixyZXBsYWNlU3RyOiIuanMifSxERUJVRzp7c2VhcmNoRXhwOiItbWluXFwuanMiLHJlcGxhY2VTdHI6Ii1kZWJ1Zy5qcyJ9LENPVkVSQUdFOntzZWFyY2hFeHA6Ii1taW5cXC5qcyIscmVwbGFjZVN0cjoiLWNvdmVyYWdlLmpzIn19LF9pbnNwZWN0UGFnZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdCxuLHIsaSxzO2ZvcihzIGluIHcpdy5oYXNPd25Qcm9wZXJ0eShzKSYmKHQ9d1tzXSx0LmRldGFpbHMmJihuPWUuZ2V0TW9kdWxlSW5mbyh0Lm5hbWUpLHI9dC5kZXRhaWxzLnJlcXVpcmVzLGk9biYmbi5yZXF1aXJlcyxuPyFuLl9pbnNwZWN0ZWQmJnImJmkubGVuZ3RoIT09ci5sZW5ndGgmJmRlbGV0ZSBuLmV4cGFuZGVkOm49ZS5hZGRNb2R1bGUodC5kZXRhaWxzLHMpLG4uX2luc3BlY3RlZD0hMCkpfSxfcmVxdWlyZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvPXRoaXMuZ2V0TW9kdWxlSW5mbyhlKSxhPXRoaXMuZ2V0TW9kdWxlSW5mbyh0KTtpZighb3x8IWEpcmV0dXJuITE7cj1vLmV4cGFuZGVkX21hcCxpPW8uYWZ0ZXJfbWFwO2lmKGkmJnQgaW4gaSlyZXR1cm4hMDtpPWEuYWZ0ZXJfbWFwO2lmKGkmJmUgaW4gaSlyZXR1cm4hMTtzPWEuc3VwZXJzZWRlcztpZihzKWZvcihuPTA7bjxzLmxlbmd0aDtuKyspaWYodGhpcy5fcmVxdWlyZXMoZSxzW25dKSlyZXR1cm4hMDtzPW8uc3VwZXJzZWRlcztpZihzKWZvcihuPTA7bjxzLmxlbmd0aDtuKyspaWYodGhpcy5fcmVxdWlyZXModCxzW25dKSlyZXR1cm4hMTtyZXR1cm4gciYmdCBpbiByPyEwOm8uZXh0JiZvLnR5cGU9PT11JiYhYS5leHQmJmEudHlwZT09PXU/ITA6ITF9LF9jb25maWc6ZnVuY3Rpb24odCl7dmFyIG4scixpLHMsbyx1LGEsZj10aGlzLGw9W10sYyxoO2lmKHQpZm9yKG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pKXtpPXRbbl07aWYobj09PSJyZXF1aXJlIilmLnJlcXVpcmUoaSk7ZWxzZSBpZihuPT09InNraW4iKXR5cGVvZiBpPT0ic3RyaW5nIiYmKGYuc2tpbi5kZWZhdWx0U2tpbj0KdC5za2luLGk9e2RlZmF1bHRTa2luOml9KSxlLm1peChmLnNraW4saSwhMCk7ZWxzZSBpZihuPT09Imdyb3VwcyIpe2ZvcihyIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShyKSl7YT1yLHU9aVtyXSxmLmFkZEdyb3VwKHUsYSk7aWYodS5hbGlhc2VzKWZvcihzIGluIHUuYWxpYXNlcyl1LmFsaWFzZXMuaGFzT3duUHJvcGVydHkocykmJmYuYWRkQWxpYXModS5hbGlhc2VzW3NdLHMpfX1lbHNlIGlmKG49PT0ibW9kdWxlcyIpZm9yKHIgaW4gaSlpLmhhc093blByb3BlcnR5KHIpJiZmLmFkZE1vZHVsZShpW3JdLHIpO2Vsc2UgaWYobj09PSJhbGlhc2VzIilmb3IociBpbiBpKWkuaGFzT3duUHJvcGVydHkocikmJmYuYWRkQWxpYXMoaVtyXSxyKTtlbHNlIG49PT0iZ2FsbGVyeSI/dGhpcy5ncm91cHMuZ2FsbGVyeS51cGRhdGUmJnRoaXMuZ3JvdXBzLmdhbGxlcnkudXBkYXRlKGksdCk6bj09PSJ5dWkyInx8bj09PSIyaW4zIj90aGlzLmdyb3Vwcy55dWkyLnVwZGF0ZSYmdGhpcy5ncm91cHMueXVpMi51cGRhdGUodFsiMmluMyJdLHQueXVpMix0KTpmW25dPWl9bz1mLmZpbHRlcixiLmlzU3RyaW5nKG8pJiYobz1vLnRvVXBwZXJDYXNlKCksZi5maWx0ZXJOYW1lPW8sZi5maWx0ZXI9Zi5GSUxURVJfREVGU1tvXSxvPT09IkRFQlVHIiYmZi5yZXF1aXJlKCJ5dWktbG9nIiwiZHVtcCIpKTtpZihmLmZpbHRlck5hbWUmJmYuY292ZXJhZ2UmJmYuZmlsdGVyTmFtZT09PSJDT1ZFUkFHRSImJmIuaXNBcnJheShmLmNvdmVyYWdlKSYmZi5jb3ZlcmFnZS5sZW5ndGgpe2ZvcihuPTA7bjxmLmNvdmVyYWdlLmxlbmd0aDtuKyspYz1mLmNvdmVyYWdlW25dLGg9Zi5nZXRNb2R1bGVJbmZvKGMpLGgmJmgudXNlP2w9bC5jb25jYXQoaC51c2UpOmwucHVzaChjKTtmLmZpbHRlcnM9Zi5maWx0ZXJzfHx7fSxlLkFycmF5LmVhY2gobCxmdW5jdGlvbihlKXtmLmZpbHRlcnNbZV09Zi5GSUxURVJfREVGUy5DT1ZFUkFHRX0pLGYuZmlsdGVyTmFtZT0iUkFXIixmLmZpbHRlcj1mLkZJTFRFUl9ERUZTW2YuZmlsdGVyTmFtZV19fSxmb3JtYXRTa2luOmZ1bmN0aW9uKGUsdCl7dmFyIG49eStlO3JldHVybiB0JiYobj1uKyItIit0KSxufSxfYWRkU2tpbjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxzLG89dGhpcy5za2luLHU9dCYmdGhpcy5nZXRNb2R1bGVJbmZvKHQpLGE9dSYmdS5leHQ7cmV0dXJuIHQmJihpPXRoaXMuZm9ybWF0U2tpbihlLHQpLHRoaXMuZ2V0TW9kdWxlSW5mbyhpKXx8KHI9dS5wa2d8fHQscz17c2tpbjohMCxuYW1lOmksZ3JvdXA6dS5ncm91cCx0eXBlOiJjc3MiLGFmdGVyOm8uYWZ0ZXIscGF0aDoobnx8cikrIi8iK28uYmFzZStlKyIvIit0KyIuY3NzIixleHQ6YX0sdS5iYXNlJiYocy5iYXNlPXUuYmFzZSksdS5jb25maWdGbiYmKHMuY29uZmlnRm49dS5jb25maWdGbiksdGhpcy5hZGRNb2R1bGUocyxpKSkpLGl9LGFkZEFsaWFzOmZ1bmN0aW9uKGUsdCl7WVVJLkVudi5hbGlhc2VzW3RdPWUsdGhpcy5hZGRNb2R1bGUoe25hbWU6dCx1c2U6ZX0pfSxhZGRHcm91cDpmdW5jdGlvbihlLHQpe3ZhciBuPWUubW9kdWxlcyxyPXRoaXMsaSxzO3Q9dHx8ZS5uYW1lLGUubmFtZT10LHIuZ3JvdXBzW3RdPWU7aWYoZS5wYXR0ZXJucylmb3IoaSBpbiBlLnBhdHRlcm5zKWUucGF0dGVybnMuaGFzT3duUHJvcGVydHkoaSkmJihlLnBhdHRlcm5zW2ldLmdyb3VwPXQsci5wYXR0ZXJuc1tpXT1lLnBhdHRlcm5zW2ldKTtpZihuKWZvcihpIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShpKSYmKHM9bltpXSx0eXBlb2Ygcz09InN0cmluZyImJihzPXtuYW1lOmksZnVsbHBhdGg6c30pLHMuZ3JvdXA9dCxyLmFkZE1vZHVsZShzLGkpKX0sYWRkTW9kdWxlOmZ1bmN0aW9uKHQsbil7bj1ufHx0Lm5hbWUsdHlwZW9mIHQ9PSJzdHJpbmciJiYodD17bmFtZTpuLGZ1bGxwYXRoOnR9KTt2YXIgcixpLG8sZixsLGMscCxkLG0sZyx5LGIsdyxFLHgsVCxOLEMsayxMLEEsTyxNPXRoaXMubW9kdWxlSW5mb1tuXSxfPXRoaXMuY29uZGl0aW9ucyxEO00mJk0udGVtcCYmKHQ9ZS5tZXJnZShNLHQpKSx0Lm5hbWU9bjtpZighdHx8IXQubmFtZSlyZXR1cm4gbnVsbDt0LnR5cGV8fCh0LnR5cGU9YSxPPXQucGF0aHx8dC5mdWxscGF0aCxPJiZ0aGlzLlJFR0VYX0NTUy50ZXN0KE8pJiYodC50eXBlPXUpKSwhdC5wYXRoJiYhdC5mdWxscGF0aCYmKHQucGF0aD1TKG4sbix0LnR5cGUpKSx0LnN1cGVyc2VkZXM9dC5zdXBlcnNlZGVzfHx0LnVzZSx0LmV4dD0iZXh0ImluIHQ/dC5leHQ6dGhpcy5faW50ZXJuYWw/ITE6ITAscj10LnN1Ym1vZHVsZXMsdGhpcy5tb2R1bGVJbmZvW25dPXQsdC5yZXF1aXJlcz10LnJlcXVpcmVzfHxbXTtpZih0aGlzLnJlcXVpcmVzKWZvcihpPTA7aTx0aGlzLnJlcXVpcmVzLmxlbmd0aDtpKyspdC5yZXF1aXJlcy5wdXNoKHRoaXMucmVxdWlyZXNbaV0pO2lmKHQuZ3JvdXAmJnRoaXMuZ3JvdXBzJiZ0aGlzLmdyb3Vwc1t0Lmdyb3VwXSl7QT10aGlzLmdyb3Vwc1t0Lmdyb3VwXTtpZihBLnJlcXVpcmVzKWZvcihpPTA7aTxBLnJlcXVpcmVzLmxlbmd0aDtpKyspdC5yZXF1aXJlcy5wdXNoKEEucmVxdWlyZXNbaV0pfXQuZGVmYXVsdHN8fCh0LmRlZmF1bHRzPXtyZXF1aXJlczp0LnJlcXVpcmVzP1tdLmNvbmNhdCh0LnJlcXVpcmVzKTpudWxsLHN1cGVyc2VkZXM6dC5zdXBlcnNlZGVzP1tdLmNvbmNhdCh0LnN1cGVyc2VkZXMpOm51bGwsb3B0aW9uYWw6dC5vcHRpb25hbD9bXS5jb25jYXQodC5vcHRpb25hbCk6bnVsbH0pLHQuc2tpbm5hYmxlJiZ0LmV4dCYmdC50ZW1wJiYoaz10aGlzLl9hZGRTa2luKHRoaXMuc2tpbi5kZWZhdWx0U2tpbixuKSx0LnJlcXVpcmVzLnVuc2hpZnQoaykpLHQucmVxdWlyZXMubGVuZ3RoJiYodC5yZXF1aXJlcz10aGlzLmZpbHRlclJlcXVpcmVzKHQucmVxdWlyZXMpfHxbXSk7aWYoIXQubGFuZ1BhY2smJnQubGFuZyl7eT12KHQubGFuZyk7Zm9yKGc9MDtnPHkubGVuZ3RoO2crKylUPXlbZ10sYj10aGlzLmdldExhbmdQYWNrTmFtZShULG4pLHA9dGhpcy5nZXRNb2R1bGVJbmZvKGIpLHB8fChwPXRoaXMuX2FkZExhbmdQYWNrKFQsdCxiKSl9aWYocil7bD10LnN1cGVyc2VkZXN8fFtdLG89MDtmb3IoaSBpbiByKWlmKHIuaGFzT3duUHJvcGVydHkoaSkpe2M9cltpXSxjLnBhdGg9Yy5wYXRofHxTKG4saSx0LnR5cGUpLGMucGtnPW4sYy5ncm91cD10Lmdyb3VwLGMuc3VwZXJzZWRlcyYmKGw9bC5jb25jYXQoYy5zdXBlcnNlZGVzKSkscD10aGlzLmFkZE1vZHVsZShjLGkpLGwucHVzaChpKTtpZihwLnNraW5uYWJsZSl7dC5za2lubmFibGU9ITAsQz10aGlzLnNraW4ub3ZlcnJpZGVzO2lmKEMmJkNbaV0pZm9yKGc9MDtnPENbaV0ubGVuZ3RoO2crKylrPXRoaXMuX2FkZFNraW4oQ1tpXVtnXSxpLG4pLGwucHVzaChrKTtrPXRoaXMuX2FkZFNraW4odGhpcy5za2luLmRlZmF1bHRTa2luLGksbiksbC5wdXNoKGspfWlmKGMubGFuZyYmYy5sYW5nLmxlbmd0aCl7eT12KGMubGFuZyk7Zm9yKGc9MDtnPHkubGVuZ3RoO2crKylUPXlbZ10sYj10aGlzLmdldExhbmdQYWNrTmFtZShULG4pLHc9dGhpcy5nZXRMYW5nUGFja05hbWUoVCxpKSxwPXRoaXMuZ2V0TW9kdWxlSW5mbyhiKSxwfHwocD10aGlzLl9hZGRMYW5nUGFjayhULHQsYikpLEU9RXx8di5oYXNoKHAuc3VwZXJzZWRlcyksdyBpbiBFfHxwLnN1cGVyc2VkZXMucHVzaCh3KSx0Lmxhbmc9dC5sYW5nfHxbXSx4PXh8fHYuaGFzaCh0LmxhbmcpLFQgaW4geHx8dC5sYW5nLnB1c2goVCksYj10aGlzLmdldExhbmdQYWNrTmFtZShoLG4pLHc9dGhpcy5nZXRMYW5nUGFja05hbWUoaCxpKSxwPXRoaXMuZ2V0TW9kdWxlSW5mbyhiKSxwfHwocD10aGlzLl9hZGRMYW5nUGFjayhULHQsYikpLHcgaW4gRXx8cC5zdXBlcnNlZGVzLnB1c2godyl9bysrfXQuc3VwZXJzZWRlcz12LmRlZHVwZShsKSx0aGlzLmFsbG93Um9sbHVwJiYodC5yb2xsdXA9bzw0P286TWF0aC5taW4oby0xLDQpKX1kPXQucGx1Z2lucztpZihkKWZvcihpIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShpKSYmKG09ZFtpXSxtLnBrZz1uLG0ucGF0aD1tLnBhdGh8fFMobixpLHQudHlwZSksbS5yZXF1aXJlcz1tLnJlcXVpcmVzfHxbXSxtLmdyb3VwPXQuZ3JvdXAsdGhpcy5hZGRNb2R1bGUobSxpKSx0LnNraW5uYWJsZSYmdGhpcy5fYWRkU2tpbih0aGlzLnNraW4uZGVmYXVsdFNraW4saSxuKSk7aWYodC5jb25kaXRpb24pe2Y9dGhpcy5fZXhwYW5kQWxpYXNlcyh0LmNvbmRpdGlvbi50cmlnZ2VyKTtmb3IoaT0wO2k8Zi5sZW5ndGg7aSsrKUQ9ZltpXSxMPXQuY29uZGl0aW9uLndoZW4sX1tEXT1fW0RdfHx7fSxfW0RdW25dPXQuY29uZGl0aW9uLEwmJkwhPT0iYWZ0ZXIiP0w9PT0iaW5zdGVhZCImJih0LnN1cGVyc2VkZXM9dC5zdXBlcnNlZGVzfHxbXSx0LnN1cGVyc2VkZXMucHVzaChEKSk6KHQuYWZ0ZXI9dC5hZnRlcnx8W10sdC5hZnRlci5wdXNoKEQpKX1yZXR1cm4gdC5zdXBlcnNlZGVzJiYodC5zdXBlcnNlZGVzPXRoaXMuZmlsdGVyUmVxdWlyZXModC5zdXBlcnNlZGVzKSksdC5hZnRlciYmKHQuYWZ0ZXI9dGhpcy5maWx0ZXJSZXF1aXJlcyh0LmFmdGVyKSx0LmFmdGVyX21hcD12Lmhhc2godC5hZnRlcikpLHQuY29uZmlnRm4mJihOPXQuY29uZmlnRm4odCksTj09PSExJiYoZGVsZXRlIHRoaXMubW9kdWxlSW5mb1tuXSxkZWxldGUgcy5fcmVuZGVyZWRNb2RzW25dLHQ9bnVsbCkpLHQmJihzLl9yZW5kZXJlZE1vZHN8fChzLl9yZW5kZXJlZE1vZHM9e30pLHMuX3JlbmRlcmVkTW9kc1tuXT1lLm1peChzLl9yZW5kZXJlZE1vZHNbbl18fHt9LHQpLHMuX2NvbmRpdGlvbnM9XyksdH0scmVxdWlyZTpmdW5jdGlvbih0KXt2YXIgbj10eXBlb2YgdD09InN0cmluZyI/dihhcmd1bWVudHMpOnQ7dGhpcy5kaXJ0eT0hMCx0aGlzLnJlcXVpcmVkPWUubWVyZ2UodGhpcy5yZXF1aXJlZCx2Lmhhc2godGhpcy5maWx0ZXJSZXF1aXJlcyhuKSkpLHRoaXMuX2V4cGxvZGVSb2xsdXBzKCl9LF9leHBsb2RlUm9sbHVwczpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdCxuLHIsaSxzLG8sdSxhPWUucmVxdWlyZWQ7aWYoIWUuYWxsb3dSb2xsdXApe2ZvcihyIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShyKSl7dD1lLmdldE1vZHVsZShyKTtpZih0JiZ0LnVzZSl7bz10LnVzZS5sZW5ndGg7Zm9yKGk9MDtpPG87aSsrKXtuPWUuZ2V0TW9kdWxlKHQudXNlW2ldKTtpZihuJiZuLnVzZSl7dT1uLnVzZS5sZW5ndGg7Zm9yKHM9MDtzPHU7cysrKWFbbi51c2Vbc11dPSEwfWVsc2UgYVt0LnVzZVtpXV09ITB9fX1lLnJlcXVpcmVkPWF9fSxmaWx0ZXJSZXF1aXJlczpmdW5jdGlvbih0KXtpZih0KXtlLkxhbmcuaXNBcnJheSh0KXx8KHQ9W3RdKSx0PWUuQXJyYXkodCk7dmFyIG49W10scixpLHMsbztmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXtpPXRoaXMuZ2V0TW9kdWxlKHRbcl0pO2lmKGkmJmkudXNlKWZvcihzPTA7czxpLnVzZS5sZW5ndGg7cysrKW89dGhpcy5nZXRNb2R1bGUoaS51c2Vbc10pLG8mJm8udXNlJiZvLm5hbWUhPT1pLm5hbWU/bj1lLkFycmF5LmRlZHVwZShbXS5jb25jYXQobix0aGlzLmZpbHRlclJlcXVpcmVzKG8udXNlKSkpOm4ucHVzaChpLnVzZVtzXSk7ZWxzZSBuLnB1c2godFtyXSl9dD1ufXJldHVybiB0fSxfY2FuQmVBdHRhY2hlZDpmdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLmdldE1vZHVsZSh0KSx0JiZ0LnRlc3Q/KHQuaGFzT3duUHJvcGVydHkoIl90ZXN0UmVzdWx0Iil8fCh0Ll90ZXN0UmVzdWx0PXQudGVzdChlKSksdC5fdGVzdFJlc3VsdCk6ITB9LGdldFJlcXVpcmVzOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiByO2lmKHQuX3BhcnNlZClyZXR1cm4gdC5leHBhbmRlZHx8cjt2YXIgbixpLHMsbyx1LGEsbCxjPXRoaXMudGVzdHJlc3VsdHMsbT10Lm5hbWUsZyx5PXdbbV0mJndbbV0uZGV0YWlscyxiPXQub3B0aW9uYWxSZXF1aXJlcyxFLFMseCxULE4sQyxrLEwsQSxPLE09dC5sYW5nfHx0LmludGwsXz1lLkZlYXR1cmVzJiZlLkZlYXR1cmVzLnRlc3RzLmxvYWQsRCxQO3QudGVtcCYmeSYmKE49dCx0PXRoaXMuYWRkTW9kdWxlKHksbSksdC5ncm91cD1OLmdyb3VwLHQucGtnPQpOLnBrZyxkZWxldGUgdC5leHBhbmRlZCksUD0hIXRoaXMubGFuZyYmdC5sYW5nQ2FjaGUhPT10aGlzLmxhbmd8fHQuc2tpbkNhY2hlIT09dGhpcy5za2luLmRlZmF1bHRTa2luO2lmKHQuZXhwYW5kZWQmJiFQKXJldHVybiB0LmV4cGFuZGVkO2lmKGIpZm9yKG49MCxvPWIubGVuZ3RoO248bztuKyspdGhpcy5fY2FuQmVBdHRhY2hlZChiW25dKSYmdC5yZXF1aXJlcy5wdXNoKGJbbl0pO0U9W10sRD17fSxUPXRoaXMuZmlsdGVyUmVxdWlyZXModC5yZXF1aXJlcyksdC5sYW5nJiYoRS51bnNoaWZ0KCJpbnRsIiksVC51bnNoaWZ0KCJpbnRsIiksTT0hMCksQz10aGlzLmZpbHRlclJlcXVpcmVzKHQub3B0aW9uYWwpLHQuX3BhcnNlZD0hMCx0LmxhbmdDYWNoZT10aGlzLmxhbmcsdC5za2luQ2FjaGU9dGhpcy5za2luLmRlZmF1bHRTa2luO2ZvcihuPTA7bjxULmxlbmd0aDtuKyspaWYoIURbVFtuXV0pe0UucHVzaChUW25dKSxEW1Rbbl1dPSEwLGk9dGhpcy5nZXRNb2R1bGUoVFtuXSk7aWYoaSl7dT10aGlzLmdldFJlcXVpcmVzKGkpLE09TXx8aS5leHBhbmRlZF9tYXAmJmYgaW4gaS5leHBhbmRlZF9tYXA7Zm9yKHM9MDtzPHUubGVuZ3RoO3MrKylFLnB1c2godVtzXSl9fVQ9dGhpcy5maWx0ZXJSZXF1aXJlcyh0LnN1cGVyc2VkZXMpO2lmKFQpZm9yKG49MDtuPFQubGVuZ3RoO24rKylpZighRFtUW25dXSl7dC5zdWJtb2R1bGVzJiZFLnB1c2goVFtuXSksRFtUW25dXT0hMCxpPXRoaXMuZ2V0TW9kdWxlKFRbbl0pO2lmKGkpe3U9dGhpcy5nZXRSZXF1aXJlcyhpKSxNPU18fGkuZXhwYW5kZWRfbWFwJiZmIGluIGkuZXhwYW5kZWRfbWFwO2ZvcihzPTA7czx1Lmxlbmd0aDtzKyspRS5wdXNoKHVbc10pfX1pZihDJiZ0aGlzLmxvYWRPcHRpb25hbClmb3Iobj0wO248Qy5sZW5ndGg7bisrKWlmKCFEW0Nbbl1dKXtFLnB1c2goQ1tuXSksRFtDW25dXT0hMCxpPXRoaXMuZ2V0TW9kdWxlSW5mbyhDW25dKTtpZihpKXt1PXRoaXMuZ2V0UmVxdWlyZXMoaSksTT1NfHxpLmV4cGFuZGVkX21hcCYmZiBpbiBpLmV4cGFuZGVkX21hcDtmb3Iocz0wO3M8dS5sZW5ndGg7cysrKUUucHVzaCh1W3NdKX19Zz10aGlzLmNvbmRpdGlvbnNbbV07aWYoZyl7dC5fcGFyc2VkPSExO2lmKGMmJl8pZChjLGZ1bmN0aW9uKGUsdCl7dmFyIG49X1t0XS5uYW1lOyFEW25dJiZfW3RdLnRyaWdnZXI9PT1tJiZlJiZfW3RdJiYoRFtuXT0hMCxFLnB1c2gobikpfSk7ZWxzZSBmb3IobiBpbiBnKWlmKGcuaGFzT3duUHJvcGVydHkobikmJiFEW25dKXt4PWdbbl0sUz14JiYoIXgudWEmJiF4LnRlc3R8fHgudWEmJmUuVUFbeC51YV18fHgudGVzdCYmeC50ZXN0KGUsVCkpO2lmKFMpe0Rbbl09ITAsRS5wdXNoKG4pLGk9dGhpcy5nZXRNb2R1bGUobik7aWYoaSl7dT10aGlzLmdldFJlcXVpcmVzKGkpO2ZvcihzPTA7czx1Lmxlbmd0aDtzKyspRS5wdXNoKHVbc10pfX19fWlmKHQuc2tpbm5hYmxlKXtMPXRoaXMuc2tpbi5vdmVycmlkZXM7Zm9yKG4gaW4gWVVJLkVudi5hbGlhc2VzKVlVSS5FbnYuYWxpYXNlcy5oYXNPd25Qcm9wZXJ0eShuKSYmZS5BcnJheS5pbmRleE9mKFlVSS5FbnYuYWxpYXNlc1tuXSxtKT4tMSYmKEE9bik7aWYoTCYmKExbbV18fEEmJkxbQV0pKXtPPW0sTFtBXSYmKE89QSk7Zm9yKG49MDtuPExbT10ubGVuZ3RoO24rKylrPXRoaXMuX2FkZFNraW4oTFtPXVtuXSxtKSx0aGlzLmlzQ1NTTG9hZGVkKGssdGhpcy5fYm9vdCl8fEUucHVzaChrKX1lbHNlIGs9dGhpcy5fYWRkU2tpbih0aGlzLnNraW4uZGVmYXVsdFNraW4sbSksdGhpcy5pc0NTU0xvYWRlZChrLHRoaXMuX2Jvb3QpfHxFLnB1c2goayl9cmV0dXJuIHQuX3BhcnNlZD0hMSxNJiYodC5sYW5nJiYhdC5sYW5nUGFjayYmZS5JbnRsJiYobD1lLkludGwubG9va3VwQmVzdExhbmcodGhpcy5sYW5nfHxoLHQubGFuZyksYT10aGlzLmdldExhbmdQYWNrTmFtZShsLG0pLGEmJkUudW5zaGlmdChhKSksRS51bnNoaWZ0KGYpKSx0LmV4cGFuZGVkX21hcD12Lmhhc2goRSksdC5leHBhbmRlZD1wLmtleXModC5leHBhbmRlZF9tYXApLHQuZXhwYW5kZWR9LGlzQ1NTTG9hZGVkOmZ1bmN0aW9uKHQsbil7aWYoIXR8fCFZVUkuRW52LmNzc1N0YW1wRWx8fCFuJiZ0aGlzLmlnbm9yZVJlZ2lzdGVyZWQpcmV0dXJuITE7dmFyIHI9WVVJLkVudi5jc3NTdGFtcEVsLGk9ITEscz1ZVUkuRW52Ll9jc3NMb2FkZWRbdF0sbz1yLmN1cnJlbnRTdHlsZTtyZXR1cm4gcyE9PXVuZGVmaW5lZD9zOihyLmNsYXNzTmFtZT10LG98fChvPWUuY29uZmlnLmRvYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCkpLG8mJm8uZGlzcGxheT09PSJub25lIiYmKGk9ITApLHIuY2xhc3NOYW1lPSIiLFlVSS5FbnYuX2Nzc0xvYWRlZFt0XT1pLGkpfSxnZXRQcm92aWRlczpmdW5jdGlvbih0KXt2YXIgcj10aGlzLmdldE1vZHVsZSh0KSxpLHM7cmV0dXJuIHI/KHImJiFyLnByb3ZpZGVzJiYoaT17fSxzPXIuc3VwZXJzZWRlcyxzJiZ2LmVhY2gocyxmdW5jdGlvbih0KXtlLm1peChpLHRoaXMuZ2V0UHJvdmlkZXModCkpfSx0aGlzKSxpW3RdPSEwLHIucHJvdmlkZXM9aSksci5wcm92aWRlcyk6bn0sY2FsY3VsYXRlOmZ1bmN0aW9uKGUsdCl7aWYoZXx8dHx8dGhpcy5kaXJ0eSllJiZ0aGlzLl9jb25maWcoZSksdGhpcy5faW5pdHx8dGhpcy5fc2V0dXAoKSx0aGlzLl9leHBsb2RlKCksdGhpcy5hbGxvd1JvbGx1cD90aGlzLl9yb2xsdXAoKTp0aGlzLl9leHBsb2RlUm9sbHVwcygpLHRoaXMuX3JlZHVjZSgpLHRoaXMuX3NvcnQoKX0sX2FkZExhbmdQYWNrOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1uLm5hbWUscyxvLHU9dGhpcy5nZXRNb2R1bGVJbmZvKHIpO3JldHVybiB1fHwocz1TKG4ucGtnfHxpLHIsYSwhMCksbz17cGF0aDpzLGludGw6ITAsbGFuZ1BhY2s6ITAsZXh0Om4uZXh0LGdyb3VwOm4uZ3JvdXAsc3VwZXJzZWRlczpbXX0sbi5yb290JiYoby5yb290PW4ucm9vdCksbi5iYXNlJiYoby5iYXNlPW4uYmFzZSksbi5jb25maWdGbiYmKG8uY29uZmlnRm49bi5jb25maWdGbiksdGhpcy5hZGRNb2R1bGUobyxyKSx0JiYoZS5FbnYubGFuZz1lLkVudi5sYW5nfHx7fSxlLkVudi5sYW5nW3RdPWUuRW52LmxhbmdbdF18fHt9LGUuRW52LmxhbmdbdF1baV09ITApKSx0aGlzLmdldE1vZHVsZUluZm8ocil9LF9zZXR1cDpmdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kdWxlSW5mbyxuLHIsaSxvLHUsYTtmb3IobiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihvPXRbbl0sbyYmKG8ucmVxdWlyZXM9di5kZWR1cGUoby5yZXF1aXJlcyksby5sYW5nJiYoYT10aGlzLmdldExhbmdQYWNrTmFtZShoLG4pLHRoaXMuX2FkZExhbmdQYWNrKG51bGwsbyxhKSkpKTt1PXt9LHRoaXMuaWdub3JlUmVnaXN0ZXJlZHx8ZS5taXgodSxzLm1vZHMpLHRoaXMuaWdub3JlJiZlLm1peCh1LHYuaGFzaCh0aGlzLmlnbm9yZSkpO2ZvcihpIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShpKSYmZS5taXgodSx0aGlzLmdldFByb3ZpZGVzKGkpKTtpZih0aGlzLmZvcmNlKWZvcihyPTA7cjx0aGlzLmZvcmNlLmxlbmd0aDtyKyspdGhpcy5mb3JjZVtyXWluIHUmJmRlbGV0ZSB1W3RoaXMuZm9yY2Vbcl1dO2UubWl4KHRoaXMubG9hZGVkLHUpLHRoaXMuX2luaXQ9ITB9LGdldExhbmdQYWNrTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiJsYW5nLyIrdCsoZT8iXyIrZToiIil9LF9leHBsb2RlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZXF1aXJlZCxuLHIsaT17fSxzPXRoaXMsbyx1O3MuZGlydHk9ITEscy5fZXhwbG9kZVJvbGx1cHMoKSx0PXMucmVxdWlyZWQ7Zm9yKG8gaW4gdCl0Lmhhc093blByb3BlcnR5KG8pJiYoaVtvXXx8KGlbb109ITAsbj1zLmdldE1vZHVsZShvKSxuJiYodT1uLmV4cG91bmQsdSYmKHRbdV09cy5nZXRNb2R1bGUodSkscj1zLmdldFJlcXVpcmVzKHRbdV0pLGUubWl4KHQsdi5oYXNoKHIpKSkscj1zLmdldFJlcXVpcmVzKG4pLGUubWl4KHQsdi5oYXNoKHIpKSkpKX0sX3BhdHRlcm5UZXN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaW5kZXhPZih0KT4tMX0sZ2V0TW9kdWxlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO3ZhciBuLHIsaSxzPXRoaXMuZ2V0TW9kdWxlSW5mbyh0KSxvPXRoaXMucGF0dGVybnM7aWYoIXN8fHMmJnMuZXh0KWZvcihpIGluIG8paWYoby5oYXNPd25Qcm9wZXJ0eShpKSl7bj1vW2ldLG4udGVzdHx8KG4udGVzdD10aGlzLl9wYXR0ZXJuVGVzdCk7aWYobi50ZXN0KHQsaSkpe3I9bjticmVha319cmV0dXJuIHM/ciYmcyYmci5jb25maWdGbiYmIXMuY29uZmlnRm4mJihzLmNvbmZpZ0ZuPXIuY29uZmlnRm4scy5jb25maWdGbihzKSk6ciYmKG4uYWN0aW9uP24uYWN0aW9uLmNhbGwodGhpcyx0LGkpOihzPXRoaXMuYWRkTW9kdWxlKGUubWVyZ2Uocix7dGVzdDp2b2lkIDAsdGVtcDohMH0pLHQpLHIuY29uZmlnRm4mJihzLmNvbmZpZ0ZuPXIuY29uZmlnRm4pKSksc30sX3JvbGx1cDpmdW5jdGlvbigpe30sX3JlZHVjZTpmdW5jdGlvbihlKXtlPWV8fHRoaXMucmVxdWlyZWQ7dmFyIHQsbixyLGkscz10aGlzLmxvYWRUeXBlLG89dGhpcy5pZ25vcmU/di5oYXNoKHRoaXMuaWdub3JlKTohMTtmb3IodCBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkodCkpe2k9dGhpcy5nZXRNb2R1bGUodCksKCh0aGlzLmxvYWRlZFt0XXx8d1t0XSkmJiF0aGlzLmZvcmNlTWFwW3RdJiYhdGhpcy5pZ25vcmVSZWdpc3RlcmVkfHxzJiZpJiZpLnR5cGUhPT1zKSYmZGVsZXRlIGVbdF0sbyYmb1t0XSYmZGVsZXRlIGVbdF0scj1pJiZpLnN1cGVyc2VkZXM7aWYocilmb3Iobj0wO248ci5sZW5ndGg7bisrKXJbbl1pbiBlJiZkZWxldGUgZVtyW25dXX1yZXR1cm4gZX0sX2ZpbmlzaDpmdW5jdGlvbihlLHQpe20ucnVubmluZz0hMTt2YXIgbj10aGlzLm9uRW5kO24mJm4uY2FsbCh0aGlzLmNvbnRleHQse21zZzplLGRhdGE6dGhpcy5kYXRhLHN1Y2Nlc3M6dH0pLHRoaXMuX2NvbnRpbnVlKCl9LF9vblN1Y2Nlc3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5tZXJnZSh0LnNraXBwZWQpLHIsaT1bXSxzPXQucmVxdWlyZVJlZ2lzdHJhdGlvbixvLHUsZixsO2ZvcihmIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShmKSYmZGVsZXRlIHQuaW5zZXJ0ZWRbZl07dC5za2lwcGVkPXt9O2ZvcihmIGluIHQuaW5zZXJ0ZWQpdC5pbnNlcnRlZC5oYXNPd25Qcm9wZXJ0eShmKSYmKGw9dC5nZXRNb2R1bGUoZiksIWx8fCFzfHxsLnR5cGUhPT1hfHxmIGluIFlVSS5FbnYubW9kcz9lLm1peCh0LmxvYWRlZCx0LmdldFByb3ZpZGVzKGYpKTppLnB1c2goZikpO3I9dC5vblN1Y2Nlc3MsdT1pLmxlbmd0aD8ibm90cmVnaXN0ZXJlZCI6InN1Y2Nlc3MiLG89IWkubGVuZ3RoLHImJnIuY2FsbCh0LmNvbnRleHQse21zZzp1LGRhdGE6dC5kYXRhLHN1Y2Nlc3M6byxmYWlsZWQ6aSxza2lwcGVkOm59KSx0Ll9maW5pc2godSxvKX0sX29uUHJvZ3Jlc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuO2lmKGUuZGF0YSYmZS5kYXRhLmxlbmd0aClmb3Iobj0wO248ZS5kYXRhLmxlbmd0aDtuKyspZS5kYXRhW25dPXQuZ2V0TW9kdWxlKGUuZGF0YVtuXS5uYW1lKTt0Lm9uUHJvZ3Jlc3MmJnQub25Qcm9ncmVzcy5jYWxsKHQuY29udGV4dCx7bmFtZTplLnVybCxkYXRhOmUuZGF0YX0pfSxfb25GYWlsdXJlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMub25GYWlsdXJlLG49W10scj0wLGk9ZS5lcnJvcnMubGVuZ3RoO2ZvcihyO3I8aTtyKyspbi5wdXNoKGUuZXJyb3JzW3JdLmVycm9yKTtuPW4uam9pbigiLCIpLHQmJnQuY2FsbCh0aGlzLmNvbnRleHQse21zZzpuLGRhdGE6dGhpcy5kYXRhLHN1Y2Nlc3M6ITF9KSx0aGlzLl9maW5pc2gobiwhMSl9LF9vblRpbWVvdXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5vblRpbWVvdXQ7dCYmdC5jYWxsKHRoaXMuY29udGV4dCx7bXNnOiJ0aW1lb3V0IixkYXRhOnRoaXMuZGF0YSxzdWNjZXNzOiExLHRyYW5zYWN0aW9uOmV9KX0sX3NvcnQ6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMucmVxdWlyZWQsbj17fTt0aGlzLnNvcnRlZD1bXTtmb3IoZSBpbiB0KSFuW2VdJiZ0Lmhhc093blByb3BlcnR5KGUpJiYKdGhpcy5fdmlzaXQoZSxuKX0sX3Zpc2l0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbyx1LGEsZixsO3RbZV09ITAsbj10aGlzLnJlcXVpcmVkLGk9dGhpcy5tb2R1bGVJbmZvW2VdLHI9dGhpcy5jb25kaXRpb25zW2VdfHx7fTtpZihpKXtvPWkuZXhwYW5kZWR8fGkucmVxdWlyZXM7Zm9yKGY9MCxsPW8ubGVuZ3RoO2Y8bDsrK2Ypcz1vW2ZdLHU9cltzXSxhPXUmJighdS53aGVufHx1LndoZW49PT0iYWZ0ZXIiKSxuW3NdJiYhdFtzXSYmIWEmJnRoaXMuX3Zpc2l0KHMsdCl9dGhpcy5zb3J0ZWQucHVzaChlKX0sX2luc2VydDpmdW5jdGlvbih0LG4scixpKXt0JiZ0aGlzLl9jb25maWcodCk7dmFyIHM9dGhpcy5yZXNvbHZlKCFpKSxvPXRoaXMsZj0wLGw9MCxjPXt9LGgscDtvLl9yZWZldGNoPVtdLHImJihzW3I9PT1hP3U6YV09W10pLG8uZmV0Y2hDU1N8fChzLmNzcz1bXSkscy5qcy5sZW5ndGgmJmYrKyxzLmNzcy5sZW5ndGgmJmYrKyxwPWZ1bmN0aW9uKHQpe2wrKzt2YXIgbj17fSxyPTAsaT0wLHM9IiIsdSxhLHA7aWYodCYmdC5lcnJvcnMpZm9yKHI9MDtyPHQuZXJyb3JzLmxlbmd0aDtyKyspdC5lcnJvcnNbcl0ucmVxdWVzdD9zPXQuZXJyb3JzW3JdLnJlcXVlc3QudXJsOnM9dC5lcnJvcnNbcl0sbltzXT1zO2lmKHQmJnQuZGF0YSYmdC5kYXRhLmxlbmd0aCYmdC50eXBlPT09InN1Y2Nlc3MiKWZvcihyPTA7cjx0LmRhdGEubGVuZ3RoO3IrKyl7by5pbnNlcnRlZFt0LmRhdGFbcl0ubmFtZV09ITA7aWYodC5kYXRhW3JdLmxhbmd8fHQuZGF0YVtyXS5za2lubmFibGUpZGVsZXRlIG8uaW5zZXJ0ZWRbdC5kYXRhW3JdLm5hbWVdLG8uX3JlZmV0Y2gucHVzaCh0LmRhdGFbcl0ubmFtZSl9aWYobD09PWYpe28uX2xvYWRpbmc9bnVsbDtpZihvLl9yZWZldGNoLmxlbmd0aCl7Zm9yKHI9MDtyPG8uX3JlZmV0Y2gubGVuZ3RoO3IrKyl7aD1vLmdldFJlcXVpcmVzKG8uZ2V0TW9kdWxlKG8uX3JlZmV0Y2hbcl0pKTtmb3IoaT0wO2k8aC5sZW5ndGg7aSsrKW8uaW5zZXJ0ZWRbaFtpXV18fChjW2hbaV1dPWhbaV0pfWM9ZS5PYmplY3Qua2V5cyhjKTtpZihjLmxlbmd0aCl7by5yZXF1aXJlKGMpLHA9by5yZXNvbHZlKCEwKTtpZihwLmNzc01vZHMubGVuZ3RoKXtmb3Iocj0wO3I8cC5jc3NNb2RzLmxlbmd0aDtyKyspYT1wLmNzc01vZHNbcl0ubmFtZSxkZWxldGUgWVVJLkVudi5fY3NzTG9hZGVkW2FdLG8uaXNDU1NMb2FkZWQoYSkmJihvLmluc2VydGVkW2FdPSEwLGRlbGV0ZSBvLnJlcXVpcmVkW2FdKTtvLnNvcnRlZD1bXSxvLl9zb3J0KCl9dD1udWxsLG8uX2luc2VydCgpfX10JiZ0LmZuJiYodT10LmZuLGRlbGV0ZSB0LmZuLHUuY2FsbChvLHQpKX19LHRoaXMuX2xvYWRpbmc9ITA7aWYoIXMuanMubGVuZ3RoJiYhcy5jc3MubGVuZ3RoKXtsPS0xLHAoe2ZuOm8uX29uU3VjY2Vzc30pO3JldHVybn1zLmNzcy5sZW5ndGgmJmUuR2V0LmNzcyhzLmNzcyx7ZGF0YTpzLmNzc01vZHMsYXR0cmlidXRlczpvLmNzc0F0dHJpYnV0ZXMsaW5zZXJ0QmVmb3JlOm8uaW5zZXJ0QmVmb3JlLGNoYXJzZXQ6by5jaGFyc2V0LHRpbWVvdXQ6by50aW1lb3V0LGNvbnRleHQ6byxvblByb2dyZXNzOmZ1bmN0aW9uKGUpe28uX29uUHJvZ3Jlc3MuY2FsbChvLGUpfSxvblRpbWVvdXQ6ZnVuY3Rpb24oZSl7by5fb25UaW1lb3V0LmNhbGwobyxlKX0sb25TdWNjZXNzOmZ1bmN0aW9uKGUpe2UudHlwZT0ic3VjY2VzcyIsZS5mbj1vLl9vblN1Y2Nlc3MscC5jYWxsKG8sZSl9LG9uRmFpbHVyZTpmdW5jdGlvbihlKXtlLnR5cGU9ImZhaWx1cmUiLGUuZm49by5fb25GYWlsdXJlLHAuY2FsbChvLGUpfX0pLHMuanMubGVuZ3RoJiZlLkdldC5qcyhzLmpzLHtkYXRhOnMuanNNb2RzLGluc2VydEJlZm9yZTpvLmluc2VydEJlZm9yZSxhdHRyaWJ1dGVzOm8uanNBdHRyaWJ1dGVzLGNoYXJzZXQ6by5jaGFyc2V0LHRpbWVvdXQ6by50aW1lb3V0LGF1dG9wdXJnZTohMSxjb250ZXh0Om8sYXN5bmM6by5hc3luYyxvblByb2dyZXNzOmZ1bmN0aW9uKGUpe28uX29uUHJvZ3Jlc3MuY2FsbChvLGUpfSxvblRpbWVvdXQ6ZnVuY3Rpb24oZSl7by5fb25UaW1lb3V0LmNhbGwobyxlKX0sb25TdWNjZXNzOmZ1bmN0aW9uKGUpe2UudHlwZT0ic3VjY2VzcyIsZS5mbj1vLl9vblN1Y2Nlc3MscC5jYWxsKG8sZSl9LG9uRmFpbHVyZTpmdW5jdGlvbihlKXtlLnR5cGU9ImZhaWx1cmUiLGUuZm49by5fb25GYWlsdXJlLHAuY2FsbChvLGUpfX0pfSxfY29udGludWU6ZnVuY3Rpb24oKXshbS5ydW5uaW5nJiZtLnNpemUoKT4wJiYobS5ydW5uaW5nPSEwLG0ubmV4dCgpKCkpfSxpbnNlcnQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXRoaXMscz1lLm1lcmdlKHRoaXMpO2RlbGV0ZSBzLnJlcXVpcmUsZGVsZXRlIHMuZGlydHksbS5hZGQoZnVuY3Rpb24oKXtpLl9pbnNlcnQocyx0LG4scil9KSx0aGlzLl9jb250aW51ZSgpfSxsb2FkTmV4dDpmdW5jdGlvbigpe3JldHVybn0sX2ZpbHRlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5maWx0ZXIsaT10JiZ0IGluIHRoaXMuZmlsdGVycyxzPWkmJnRoaXMuZmlsdGVyc1t0XSxvPW58fCh0aGlzLmdldE1vZHVsZUluZm8odCl8fHt9KS5ncm91cHx8bnVsbDtyZXR1cm4gbyYmdGhpcy5ncm91cHNbb10mJnRoaXMuZ3JvdXBzW29dLmZpbHRlciYmKHM9dGhpcy5ncm91cHNbb10uZmlsdGVyLGk9ITApLGUmJihpJiYocj1iLmlzU3RyaW5nKHMpP3RoaXMuRklMVEVSX0RFRlNbcy50b1VwcGVyQ2FzZSgpXXx8bnVsbDpzKSxyJiYoZT1lLnJlcGxhY2UobmV3IFJlZ0V4cChyLnNlYXJjaEV4cCwiZyIpLHIucmVwbGFjZVN0cikpKSxlfSxfdXJsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fZmlsdGVyKChufHx0aGlzLmJhc2V8fCIiKStlLHQpfSxyZXNvbHZlOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcyxzPXtqczpbXSxqc01vZHM6W10sY3NzOltdLGNzc01vZHM6W119LG87KHIuc2tpbi5vdmVycmlkZXN8fHIuc2tpbi5kZWZhdWx0U2tpbiE9PWx8fHIuaWdub3JlUmVnaXN0ZXJlZCkmJnIuX3Jlc2V0TW9kdWxlcygpLGUmJnIuY2FsY3VsYXRlKCksdD10fHxyLnNvcnRlZCxvPWZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWUuZ3JvdXAmJnIuZ3JvdXBzW2UuZ3JvdXBdfHxuLGk7dC5hc3luYz09PSExJiYoZS5hc3luYz10LmFzeW5jKSxpPWUuZnVsbHBhdGg/ci5fZmlsdGVyKGUuZnVsbHBhdGgsZS5uYW1lKTpyLl91cmwoZS5wYXRoLGUubmFtZSx0LmJhc2V8fGUuYmFzZSk7aWYoZS5hdHRyaWJ1dGVzfHxlLmFzeW5jPT09ITEpaT17dXJsOmksYXN5bmM6ZS5hc3luY30sZS5hdHRyaWJ1dGVzJiYoaS5hdHRyaWJ1dGVzPWUuYXR0cmlidXRlcyk7c1tlLnR5cGVdLnB1c2goaSksc1tlLnR5cGUrIk1vZHMiXS5wdXNoKGUpfX07dmFyIGY9ci5pZ25vcmVSZWdpc3RlcmVkP3t9OnIuaW5zZXJ0ZWQsYz17fSxoLHAsZCx2LG0sZyx5LGI7Zm9yKGI9MCx5PXQubGVuZ3RoO2I8eTtiKyspe2c9ci5nZXRNb2R1bGUodFtiXSk7aWYoIWd8fGZbZy5uYW1lXSljb250aW51ZTttPXIuZ3JvdXBzW2cuZ3JvdXBdLGQ9ci5jb21ib0Jhc2U7aWYobSl7aWYoIW0uY29tYmluZXx8Zy5mdWxscGF0aCl7byhnKTtjb250aW51ZX1nLmNvbWJpbmU9ITAsdHlwZW9mIG0ucm9vdD09InN0cmluZyImJihnLnJvb3Q9bS5yb290KSxkPW0uY29tYm9CYXNlfHxkLHY9bS5jb21ib1NlcCxoPW0ubWF4VVJMTGVuZ3RofWVsc2UgaWYoIXIuY29tYmluZSl7byhnKTtjb250aW51ZX1pZighZy5jb21iaW5lJiZnLmV4dCl7byhnKTtjb250aW51ZX1jW2RdPWNbZF18fHtqczpbXSxqc01vZHM6W10sY3NzOltdLGNzc01vZHM6W119LHA9Y1tkXSxwLmdyb3VwPWcuZ3JvdXAscC5jb21ib1NlcD12fHxyLmNvbWJvU2VwLHAubWF4VVJMTGVuZ3RoPWh8fHIubWF4VVJMTGVuZ3RoLHBbZy50eXBlKyJNb2RzIl0ucHVzaChnKX12YXIgdyxFLFMseCxULE4sQztmb3IoZCBpbiBjKWlmKGMuaGFzT3duUHJvcGVydHkoZCkpe3A9Y1tkXSx2PXAuY29tYm9TZXAsaD1wLm1heFVSTExlbmd0aDtmb3IoQyBpbiBwKWlmKEM9PT1hfHxDPT09dSl7RT1wW0MrIk1vZHMiXSxUPVtdO2ZvcihiPTAseT1FLmxlbmd0aDtiPHk7Yis9MSlnPUVbYl0sTj0odHlwZW9mIGcucm9vdD09InN0cmluZyI/Zy5yb290OnIucm9vdCkrKGcucGF0aHx8Zy5mdWxscGF0aCksVC5wdXNoKHIuX2ZpbHRlcihOLGcubmFtZSkpO1M9ZCtULmpvaW4odikseD1TLmxlbmd0aCxoPD1kLmxlbmd0aCYmKGg9aSk7aWYoVC5sZW5ndGgpaWYoeD5oKXt3PVtdO2ZvcihiPTAseT1ULmxlbmd0aDtiPHk7YisrKXcucHVzaChUW2JdKSxTPWQrdy5qb2luKHYpLFMubGVuZ3RoPmgmJihOPXcucG9wKCksUz1kK3cuam9pbih2KSxzW0NdLnB1c2goci5fZmlsdGVyKFMsbnVsbCxwLmdyb3VwKSksdz1bXSxOJiZ3LnB1c2goTikpO3cubGVuZ3RoJiYoUz1kK3cuam9pbih2KSxzW0NdLnB1c2goci5fZmlsdGVyKFMsbnVsbCxwLmdyb3VwKSkpfWVsc2Ugc1tDXS5wdXNoKHIuX2ZpbHRlcihTLG51bGwscC5ncm91cCkpO3NbQysiTW9kcyJdPXNbQysiTW9kcyJdLmNvbmNhdChFKX19cmV0dXJuIHN9LGxvYWQ6ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO3ZhciB0PXRoaXMsbj10LnJlc29sdmUoITApO3QuZGF0YT1uLHQub25FbmQ9ZnVuY3Rpb24oKXtlLmFwcGx5KHQuY29udGV4dHx8dCxhcmd1bWVudHMpfSx0Lmluc2VydCgpfX19LCIzLjE3LjIiLHtyZXF1aXJlczpbImdldCIsImZlYXR1cmVzIl19KSxZVUkuYWRkKCJsb2FkZXItcm9sbHVwIixmdW5jdGlvbihlLHQpe2UuTG9hZGVyLnByb3RvdHlwZS5fcm9sbHVwPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaT10aGlzLnJlcXVpcmVkLHMsbz10aGlzLm1vZHVsZUluZm8sdSxhLGY7aWYodGhpcy5kaXJ0eXx8IXRoaXMucm9sbHVwcyl7dGhpcy5yb2xsdXBzPXt9O2ZvcihlIGluIG8pby5oYXNPd25Qcm9wZXJ0eShlKSYmKG49dGhpcy5nZXRNb2R1bGUoZSksbiYmbi5yb2xsdXAmJih0aGlzLnJvbGx1cHNbZV09bikpfWZvcig7Oyl7dT0hMTtmb3IoZSBpbiB0aGlzLnJvbGx1cHMpaWYodGhpcy5yb2xsdXBzLmhhc093blByb3BlcnR5KGUpJiYhaVtlXSYmKCF0aGlzLmxvYWRlZFtlXXx8dGhpcy5mb3JjZU1hcFtlXSkpe249dGhpcy5nZXRNb2R1bGUoZSkscj1uLnN1cGVyc2VkZXN8fFtdLHM9ITE7aWYoIW4ucm9sbHVwKWNvbnRpbnVlO2E9MDtmb3IodD0wO3Q8ci5sZW5ndGg7dCsrKXtmPW9bclt0XV07aWYodGhpcy5sb2FkZWRbclt0XV0mJiF0aGlzLmZvcmNlTWFwW3JbdF1dKXtzPSExO2JyZWFrfWlmKGlbclt0XV0mJm4udHlwZT09PWYudHlwZSl7YSsrLHM9YT49bi5yb2xsdXA7aWYocylicmVha319cyYmKGlbZV09ITAsdT0hMCx0aGlzLmdldFJlcXVpcmVzKG4pKX1pZighdSlicmVha319fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJsb2FkZXItYmFzZSJdfSksWVVJLmFkZCgibG9hZGVyLXl1aTMiLGZ1bmN0aW9uKGUsdCl7WVVJLkVudltlLnZlcnNpb25dLm1vZHVsZXM9WVVJLkVudltlLnZlcnNpb25dLm1vZHVsZXN8fHt9LGUubWl4KFlVSS5FbnZbZS52ZXJzaW9uXS5tb2R1bGVzLHsiYWxpZ24tcGx1Z2luIjp7cmVxdWlyZXM6WyJub2RlLXNjcmVlbiIsIm5vZGUtcGx1Z2luaG9zdCJdfSxhbmltOnt1c2U6WyJhbmltLWJhc2UiLCJhbmltLWNvbG9yIiwiYW5pbS1jdXJ2ZSIsImFuaW0tZWFzaW5nIiwiYW5pbS1ub2RlLXBsdWdpbiIsImFuaW0tc2Nyb2xsIiwiYW5pbS14eSJdfSwiYW5pbS1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlLWJhc2UiLCJub2RlLXN0eWxlIiwiY29sb3ItYmFzZSJdfSwiYW5pbS1jb2xvciI6e3JlcXVpcmVzOlsiYW5pbS1iYXNlIl19LCJhbmltLWN1cnZlIjp7cmVxdWlyZXM6WyJhbmltLXh5Il19LCJhbmltLWVhc2luZyI6e3JlcXVpcmVzOlsiYW5pbS1iYXNlIl19LCJhbmltLW5vZGUtcGx1Z2luIjp7cmVxdWlyZXM6WyJub2RlLXBsdWdpbmhvc3QiLCJhbmltLWJhc2UiXX0sImFuaW0tc2Nyb2xsIjp7cmVxdWlyZXM6WyJhbmltLWJhc2UiXX0sImFuaW0tc2hhcGUiOntyZXF1aXJlczpbImFuaW0tYmFzZSIsImFuaW0tZWFzaW5nIiwiYW5pbS1jb2xvciIKLCJtYXRyaXgiXX0sImFuaW0tc2hhcGUtdHJhbnNmb3JtIjp7dXNlOlsiYW5pbS1zaGFwZSJdfSwiYW5pbS14eSI6e3JlcXVpcmVzOlsiYW5pbS1iYXNlIiwibm9kZS1zY3JlZW4iXX0sYXBwOnt1c2U6WyJhcHAtYmFzZSIsImFwcC1jb250ZW50IiwiYXBwLXRyYW5zaXRpb25zIiwibGF6eS1tb2RlbC1saXN0IiwibW9kZWwiLCJtb2RlbC1saXN0IiwibW9kZWwtc3luYy1yZXN0IiwibW9kZWwtc3luYy1sb2NhbCIsInJvdXRlciIsInZpZXciLCJ2aWV3LW5vZGUtbWFwIl19LCJhcHAtYmFzZSI6e3JlcXVpcmVzOlsiY2xhc3NuYW1lbWFuYWdlciIsInBqYXgtYmFzZSIsInJvdXRlciIsInZpZXciXX0sImFwcC1jb250ZW50Ijp7cmVxdWlyZXM6WyJhcHAtYmFzZSIsInBqYXgtY29udGVudCJdfSwiYXBwLXRyYW5zaXRpb25zIjp7cmVxdWlyZXM6WyJhcHAtYmFzZSJdfSwiYXBwLXRyYW5zaXRpb25zLWNzcyI6e3R5cGU6ImNzcyJ9LCJhcHAtdHJhbnNpdGlvbnMtbmF0aXZlIjp7Y29uZGl0aW9uOntuYW1lOiJhcHAtdHJhbnNpdGlvbnMtbmF0aXZlIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQ/dC5kb2N1bWVudEVsZW1lbnQ6bnVsbDtyZXR1cm4gbiYmbi5zdHlsZT8iTW96VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwiV2Via2l0VHJhbnNpdGlvbiJpbiBuLnN0eWxlfHwidHJhbnNpdGlvbiJpbiBuLnN0eWxlOiExfSx0cmlnZ2VyOiJhcHAtdHJhbnNpdGlvbnMifSxyZXF1aXJlczpbImFwcC10cmFuc2l0aW9ucyIsImFwcC10cmFuc2l0aW9ucy1jc3MiLCJwYXJhbGxlbCIsInRyYW5zaXRpb24iXX0sImFycmF5LWV4dHJhcyI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImFycmF5LWludm9rZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sYXJyYXlsaXN0OntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJhcnJheWxpc3QtYWRkIjp7cmVxdWlyZXM6WyJhcnJheWxpc3QiXX0sImFycmF5bGlzdC1maWx0ZXIiOntyZXF1aXJlczpbImFycmF5bGlzdCJdfSxhcnJheXNvcnQ6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImFzeW5jLXF1ZXVlIjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20iXX0sYXR0cmlidXRlOnt1c2U6WyJhdHRyaWJ1dGUtYmFzZSIsImF0dHJpYnV0ZS1jb21wbGV4Il19LCJhdHRyaWJ1dGUtYmFzZSI6e3JlcXVpcmVzOlsiYXR0cmlidXRlLWNvcmUiLCJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImF0dHJpYnV0ZS1leHRyYXMiXX0sImF0dHJpYnV0ZS1jb21wbGV4Ijp7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtYmFzZSJdfSwiYXR0cmlidXRlLWNvcmUiOntyZXF1aXJlczpbIm9vcCJdfSwiYXR0cmlidXRlLWV2ZW50cyI6e3VzZTpbImF0dHJpYnV0ZS1vYnNlcnZhYmxlIl19LCJhdHRyaWJ1dGUtZXh0cmFzIjp7cmVxdWlyZXM6WyJvb3AiXX0sImF0dHJpYnV0ZS1vYnNlcnZhYmxlIjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20iXX0sYXV0b2NvbXBsZXRlOnt1c2U6WyJhdXRvY29tcGxldGUtYmFzZSIsImF1dG9jb21wbGV0ZS1zb3VyY2VzIiwiYXV0b2NvbXBsZXRlLWxpc3QiLCJhdXRvY29tcGxldGUtcGx1Z2luIl19LCJhdXRvY29tcGxldGUtYmFzZSI6e29wdGlvbmFsOlsiYXV0b2NvbXBsZXRlLXNvdXJjZXMiXSxyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsImJhc2UtYnVpbGQiLCJlc2NhcGUiLCJldmVudC12YWx1ZWNoYW5nZSIsIm5vZGUtYmFzZSJdfSwiYXV0b2NvbXBsZXRlLWZpbHRlcnMiOntyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsInRleHQtd29yZGJyZWFrIl19LCJhdXRvY29tcGxldGUtZmlsdGVycy1hY2NlbnRmb2xkIjp7cmVxdWlyZXM6WyJhcnJheS1leHRyYXMiLCJ0ZXh0LWFjY2VudGZvbGQiLCJ0ZXh0LXdvcmRicmVhayJdfSwiYXV0b2NvbXBsZXRlLWhpZ2hsaWdodGVycyI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiaGlnaGxpZ2h0LWJhc2UiXX0sImF1dG9jb21wbGV0ZS1oaWdobGlnaHRlcnMtYWNjZW50Zm9sZCI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiaGlnaGxpZ2h0LWFjY2VudGZvbGQiXX0sImF1dG9jb21wbGV0ZS1saXN0Ijp7YWZ0ZXI6WyJhdXRvY29tcGxldGUtc291cmNlcyJdLGxhbmc6WyJlbiIsImVzIiwiaHUiLCJpdCJdLHJlcXVpcmVzOlsiYXV0b2NvbXBsZXRlLWJhc2UiLCJldmVudC1yZXNpemUiLCJub2RlLXNjcmVlbiIsInNlbGVjdG9yLWNzczMiLCJzaGltLXBsdWdpbiIsIndpZGdldCIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1wb3NpdGlvbi1hbGlnbiJdLHNraW5uYWJsZTohMH0sImF1dG9jb21wbGV0ZS1saXN0LWtleXMiOntjb25kaXRpb246e25hbWU6ImF1dG9jb21wbGV0ZS1saXN0LWtleXMiLHRlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIWUuVUEuaW9zJiYhZS5VQS5hbmRyb2lkfSx0cmlnZ2VyOiJhdXRvY29tcGxldGUtbGlzdCJ9LHJlcXVpcmVzOlsiYXV0b2NvbXBsZXRlLWxpc3QiLCJiYXNlLWJ1aWxkIl19LCJhdXRvY29tcGxldGUtcGx1Z2luIjp7cmVxdWlyZXM6WyJhdXRvY29tcGxldGUtbGlzdCIsIm5vZGUtcGx1Z2luaG9zdCJdfSwiYXV0b2NvbXBsZXRlLXNvdXJjZXMiOntvcHRpb25hbDpbImlvLWJhc2UiLCJqc29uLXBhcnNlIiwianNvbnAiLCJ5cWwiXSxyZXF1aXJlczpbImF1dG9jb21wbGV0ZS1iYXNlIl19LGF4ZXM6e3VzZTpbImF4aXMtbnVtZXJpYyIsImF4aXMtY2F0ZWdvcnkiLCJheGlzLXRpbWUiLCJheGlzLXN0YWNrZWQiXX0sImF4ZXMtYmFzZSI6e3VzZTpbImF4aXMtbnVtZXJpYy1iYXNlIiwiYXhpcy1jYXRlZ29yeS1iYXNlIiwiYXhpcy10aW1lLWJhc2UiLCJheGlzLXN0YWNrZWQtYmFzZSJdfSxheGlzOntyZXF1aXJlczpbImRvbSIsIndpZGdldCIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1zdGFjayIsImdyYXBoaWNzIiwiYXhpcy1iYXNlIl19LCJheGlzLWJhc2UiOntyZXF1aXJlczpbImNsYXNzbmFtZW1hbmFnZXIiLCJkYXRhdHlwZS1udW1iZXIiLCJkYXRhdHlwZS1kYXRlIiwiYmFzZSIsImV2ZW50LWN1c3RvbSJdfSwiYXhpcy1jYXRlZ29yeSI6e3JlcXVpcmVzOlsiYXhpcyIsImF4aXMtY2F0ZWdvcnktYmFzZSJdfSwiYXhpcy1jYXRlZ29yeS1iYXNlIjp7cmVxdWlyZXM6WyJheGlzLWJhc2UiXX0sImF4aXMtbnVtZXJpYyI6e3JlcXVpcmVzOlsiYXhpcyIsImF4aXMtbnVtZXJpYy1iYXNlIl19LCJheGlzLW51bWVyaWMtYmFzZSI6e3JlcXVpcmVzOlsiYXhpcy1iYXNlIl19LCJheGlzLXN0YWNrZWQiOntyZXF1aXJlczpbImF4aXMtbnVtZXJpYyIsImF4aXMtc3RhY2tlZC1iYXNlIl19LCJheGlzLXN0YWNrZWQtYmFzZSI6e3JlcXVpcmVzOlsiYXhpcy1udW1lcmljLWJhc2UiXX0sImF4aXMtdGltZSI6e3JlcXVpcmVzOlsiYXhpcyIsImF4aXMtdGltZS1iYXNlIl19LCJheGlzLXRpbWUtYmFzZSI6e3JlcXVpcmVzOlsiYXhpcy1iYXNlIl19LGJhc2U6e3VzZTpbImJhc2UtYmFzZSIsImJhc2UtcGx1Z2luaG9zdCIsImJhc2UtYnVpbGQiXX0sImJhc2UtYmFzZSI6e3JlcXVpcmVzOlsiYXR0cmlidXRlLWJhc2UiLCJiYXNlLWNvcmUiLCJiYXNlLW9ic2VydmFibGUiXX0sImJhc2UtYnVpbGQiOntyZXF1aXJlczpbImJhc2UtYmFzZSJdfSwiYmFzZS1jb3JlIjp7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtY29yZSJdfSwiYmFzZS1vYnNlcnZhYmxlIjp7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImJhc2UtY29yZSJdfSwiYmFzZS1wbHVnaW5ob3N0Ijp7cmVxdWlyZXM6WyJiYXNlLWJhc2UiLCJwbHVnaW5ob3N0Il19LGJ1dHRvbjp7cmVxdWlyZXM6WyJidXR0b24tY29yZSIsImNzc2J1dHRvbiIsIndpZGdldCJdfSwiYnV0dG9uLWNvcmUiOntyZXF1aXJlczpbImF0dHJpYnV0ZS1jb3JlIiwiY2xhc3NuYW1lbWFuYWdlciIsIm5vZGUtYmFzZSIsImVzY2FwZSJdfSwiYnV0dG9uLWdyb3VwIjp7cmVxdWlyZXM6WyJidXR0b24tcGx1Z2luIiwiY3NzYnV0dG9uIiwid2lkZ2V0Il19LCJidXR0b24tcGx1Z2luIjp7cmVxdWlyZXM6WyJidXR0b24tY29yZSIsImNzc2J1dHRvbiIsIm5vZGUtcGx1Z2luaG9zdCJdfSxjYWNoZTp7dXNlOlsiY2FjaGUtYmFzZSIsImNhY2hlLW9mZmxpbmUiLCJjYWNoZS1wbHVnaW4iXX0sImNhY2hlLWJhc2UiOntyZXF1aXJlczpbImJhc2UiXX0sImNhY2hlLW9mZmxpbmUiOntyZXF1aXJlczpbImNhY2hlLWJhc2UiLCJqc29uIl19LCJjYWNoZS1wbHVnaW4iOntyZXF1aXJlczpbInBsdWdpbiIsImNhY2hlLWJhc2UiXX0sY2FsZW5kYXI6e3JlcXVpcmVzOlsiY2FsZW5kYXItYmFzZSIsImNhbGVuZGFybmF2aWdhdG9yIl0sc2tpbm5hYmxlOiEwfSwiY2FsZW5kYXItYmFzZSI6e2xhbmc6WyJkZSIsImVuIiwiZXMiLCJlcy1BUiIsImZyIiwiaHUiLCJpdCIsImphIiwibmItTk8iLCJubCIsInB0LUJSIiwicnUiLCJ6aC1IYW5zIiwiemgtSGFucy1DTiIsInpoLUhhbnQiLCJ6aC1IYW50LUhLIiwiemgtSEFOVC1UVyJdLHJlcXVpcmVzOlsid2lkZ2V0IiwiZGF0YXR5cGUtZGF0ZSIsImRhdGF0eXBlLWRhdGUtbWF0aCIsImNzc2dyaWRzIl0sc2tpbm5hYmxlOiEwfSxjYWxlbmRhcm5hdmlnYXRvcjp7cmVxdWlyZXM6WyJwbHVnaW4iLCJjbGFzc25hbWVtYW5hZ2VyIiwiZGF0YXR5cGUtZGF0ZSIsIm5vZGUiXSxza2lubmFibGU6ITB9LGNoYXJ0czp7dXNlOlsiY2hhcnRzLWJhc2UiXX0sImNoYXJ0cy1iYXNlIjp7cmVxdWlyZXM6WyJkb20iLCJldmVudC1tb3VzZWVudGVyIiwiZXZlbnQtdG91Y2giLCJncmFwaGljcy1ncm91cCIsImF4ZXMiLCJzZXJpZXMtcGllIiwic2VyaWVzLWxpbmUiLCJzZXJpZXMtbWFya2VyIiwic2VyaWVzLWFyZWEiLCJzZXJpZXMtc3BsaW5lIiwic2VyaWVzLWNvbHVtbiIsInNlcmllcy1iYXIiLCJzZXJpZXMtYXJlYXNwbGluZSIsInNlcmllcy1jb21ibyIsInNlcmllcy1jb21ib3NwbGluZSIsInNlcmllcy1saW5lLXN0YWNrZWQiLCJzZXJpZXMtbWFya2VyLXN0YWNrZWQiLCJzZXJpZXMtYXJlYS1zdGFja2VkIiwic2VyaWVzLXNwbGluZS1zdGFja2VkIiwic2VyaWVzLWNvbHVtbi1zdGFja2VkIiwic2VyaWVzLWJhci1zdGFja2VkIiwic2VyaWVzLWFyZWFzcGxpbmUtc3RhY2tlZCIsInNlcmllcy1jb21iby1zdGFja2VkIiwic2VyaWVzLWNvbWJvc3BsaW5lLXN0YWNrZWQiXX0sImNoYXJ0cy1sZWdlbmQiOntyZXF1aXJlczpbImNoYXJ0cy1iYXNlIl19LGNsYXNzbmFtZW1hbmFnZXI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImNsaWNrYWJsZS1yYWlsIjp7cmVxdWlyZXM6WyJzbGlkZXItYmFzZSJdfSxjb2xsZWN0aW9uOnt1c2U6WyJhcnJheS1leHRyYXMiLCJhcnJheWxpc3QiLCJhcnJheWxpc3QtYWRkIiwiYXJyYXlsaXN0LWZpbHRlciIsImFycmF5LWludm9rZSJdfSxjb2xvcjp7dXNlOlsiY29sb3ItYmFzZSIsImNvbG9yLWhzbCIsImNvbG9yLWhhcm1vbnkiXX0sImNvbG9yLWJhc2UiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJjb2xvci1oYXJtb255Ijp7cmVxdWlyZXM6WyJjb2xvci1oc2wiXX0sImNvbG9yLWhzbCI6e3JlcXVpcmVzOlsiY29sb3ItYmFzZSJdfSwiY29sb3ItaHN2Ijp7cmVxdWlyZXM6WyJjb2xvci1iYXNlIl19LGNvbnNvbGU6e2xhbmc6WyJlbiIsImVzIiwiaHUiLCJpdCIsImphIl0scmVxdWlyZXM6WyJ5dWktbG9nIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwiY29uc29sZS1maWx0ZXJzIjp7cmVxdWlyZXM6WyJwbHVnaW4iLCJjb25zb2xlIl0sc2tpbm5hYmxlOiEwfSwiY29udGVudC1lZGl0YWJsZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZWRpdG9yLXNlbGVjdGlvbiIsInN0eWxlc2hlZXQiLCJwbHVnaW4iXX0sY29udHJvbGxlcjp7dXNlOlsicm91dGVyIl19LGNvb2tpZTp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwiY3JlYXRlbGluay1iYXNlIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSJdfSxjc3NiYXNlOnthZnRlcjpbImNzc3Jlc2V0IiwiY3NzZm9udHMiLCJjc3NncmlkcyIsImNzc3Jlc2V0LWNvbnRleHQiLCJjc3Nmb250cy1jb250ZXh0IiwiY3NzZ3JpZHMtY29udGV4dCJdLHR5cGU6ImNzcyJ9LCJjc3NiYXNlLWNvbnRleHQiOnthZnRlcjpbImNzc3Jlc2V0IgosImNzc2ZvbnRzIiwiY3NzZ3JpZHMiLCJjc3NyZXNldC1jb250ZXh0IiwiY3NzZm9udHMtY29udGV4dCIsImNzc2dyaWRzLWNvbnRleHQiXSx0eXBlOiJjc3MifSxjc3NidXR0b246e3R5cGU6ImNzcyJ9LGNzc2ZvbnRzOnt0eXBlOiJjc3MifSwiY3NzZm9udHMtY29udGV4dCI6e3R5cGU6ImNzcyJ9LGNzc2dyaWRzOntvcHRpb25hbDpbImNzc25vcm1hbGl6ZSJdLHR5cGU6ImNzcyJ9LCJjc3Nncmlkcy1iYXNlIjp7b3B0aW9uYWw6WyJjc3Nub3JtYWxpemUiXSx0eXBlOiJjc3MifSwiY3NzZ3JpZHMtcmVzcG9uc2l2ZSI6e29wdGlvbmFsOlsiY3Nzbm9ybWFsaXplIl0scmVxdWlyZXM6WyJjc3NncmlkcyIsImNzc2dyaWRzLXJlc3BvbnNpdmUtYmFzZSJdLHR5cGU6ImNzcyJ9LCJjc3Nncmlkcy11bml0cyI6e29wdGlvbmFsOlsiY3Nzbm9ybWFsaXplIl0scmVxdWlyZXM6WyJjc3Nncmlkcy1iYXNlIl0sdHlwZToiY3NzIn0sY3Nzbm9ybWFsaXplOnt0eXBlOiJjc3MifSwiY3Nzbm9ybWFsaXplLWNvbnRleHQiOnt0eXBlOiJjc3MifSxjc3NyZXNldDp7dHlwZToiY3NzIn0sImNzc3Jlc2V0LWNvbnRleHQiOnt0eXBlOiJjc3MifSxkYXRhc2NoZW1hOnt1c2U6WyJkYXRhc2NoZW1hLWJhc2UiLCJkYXRhc2NoZW1hLWpzb24iLCJkYXRhc2NoZW1hLXhtbCIsImRhdGFzY2hlbWEtYXJyYXkiLCJkYXRhc2NoZW1hLXRleHQiXX0sImRhdGFzY2hlbWEtYXJyYXkiOntyZXF1aXJlczpbImRhdGFzY2hlbWEtYmFzZSJdfSwiZGF0YXNjaGVtYS1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIl19LCJkYXRhc2NoZW1hLWpzb24iOntyZXF1aXJlczpbImRhdGFzY2hlbWEtYmFzZSIsImpzb24iXX0sImRhdGFzY2hlbWEtdGV4dCI6e3JlcXVpcmVzOlsiZGF0YXNjaGVtYS1iYXNlIl19LCJkYXRhc2NoZW1hLXhtbCI6e3JlcXVpcmVzOlsiZGF0YXNjaGVtYS1iYXNlIl19LGRhdGFzb3VyY2U6e3VzZTpbImRhdGFzb3VyY2UtbG9jYWwiLCJkYXRhc291cmNlLWlvIiwiZGF0YXNvdXJjZS1nZXQiLCJkYXRhc291cmNlLWZ1bmN0aW9uIiwiZGF0YXNvdXJjZS1jYWNoZSIsImRhdGFzb3VyY2UtanNvbnNjaGVtYSIsImRhdGFzb3VyY2UteG1sc2NoZW1hIiwiZGF0YXNvdXJjZS1hcnJheXNjaGVtYSIsImRhdGFzb3VyY2UtdGV4dHNjaGVtYSIsImRhdGFzb3VyY2UtcG9sbGluZyJdfSwiZGF0YXNvdXJjZS1hcnJheXNjaGVtYSI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsInBsdWdpbiIsImRhdGFzY2hlbWEtYXJyYXkiXX0sImRhdGFzb3VyY2UtY2FjaGUiOntyZXF1aXJlczpbImRhdGFzb3VyY2UtbG9jYWwiLCJwbHVnaW4iLCJjYWNoZS1iYXNlIl19LCJkYXRhc291cmNlLWZ1bmN0aW9uIjp7cmVxdWlyZXM6WyJkYXRhc291cmNlLWxvY2FsIl19LCJkYXRhc291cmNlLWdldCI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsImdldCJdfSwiZGF0YXNvdXJjZS1pbyI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsImlvLWJhc2UiXX0sImRhdGFzb3VyY2UtanNvbnNjaGVtYSI6e3JlcXVpcmVzOlsiZGF0YXNvdXJjZS1sb2NhbCIsInBsdWdpbiIsImRhdGFzY2hlbWEtanNvbiJdfSwiZGF0YXNvdXJjZS1sb2NhbCI6e3JlcXVpcmVzOlsiYmFzZSJdfSwiZGF0YXNvdXJjZS1wb2xsaW5nIjp7cmVxdWlyZXM6WyJkYXRhc291cmNlLWxvY2FsIl19LCJkYXRhc291cmNlLXRleHRzY2hlbWEiOntyZXF1aXJlczpbImRhdGFzb3VyY2UtbG9jYWwiLCJwbHVnaW4iLCJkYXRhc2NoZW1hLXRleHQiXX0sImRhdGFzb3VyY2UteG1sc2NoZW1hIjp7cmVxdWlyZXM6WyJkYXRhc291cmNlLWxvY2FsIiwicGx1Z2luIiwiZGF0YXR5cGUteG1sIiwiZGF0YXNjaGVtYS14bWwiXX0sZGF0YXRhYmxlOnt1c2U6WyJkYXRhdGFibGUtY29yZSIsImRhdGF0YWJsZS10YWJsZSIsImRhdGF0YWJsZS1oZWFkIiwiZGF0YXRhYmxlLWJvZHkiLCJkYXRhdGFibGUtYmFzZSIsImRhdGF0YWJsZS1jb2x1bW4td2lkdGhzIiwiZGF0YXRhYmxlLW1lc3NhZ2UiLCJkYXRhdGFibGUtbXV0YWJsZSIsImRhdGF0YWJsZS1zb3J0IiwiZGF0YXRhYmxlLWRhdGFzb3VyY2UiXX0sImRhdGF0YWJsZS1iYXNlIjp7cmVxdWlyZXM6WyJkYXRhdGFibGUtY29yZSIsImRhdGF0YWJsZS10YWJsZSIsImRhdGF0YWJsZS1oZWFkIiwiZGF0YXRhYmxlLWJvZHkiLCJiYXNlLWJ1aWxkIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwiZGF0YXRhYmxlLWJvZHkiOntyZXF1aXJlczpbImRhdGF0YWJsZS1jb3JlIiwidmlldyIsImNsYXNzbmFtZW1hbmFnZXIiXX0sImRhdGF0YWJsZS1jb2x1bW4td2lkdGhzIjp7cmVxdWlyZXM6WyJkYXRhdGFibGUtYmFzZSJdfSwiZGF0YXRhYmxlLWNvcmUiOntyZXF1aXJlczpbImVzY2FwZSIsIm1vZGVsLWxpc3QiLCJub2RlLWV2ZW50LWRlbGVnYXRlIl19LCJkYXRhdGFibGUtZGF0YXNvdXJjZSI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiLCJwbHVnaW4iLCJkYXRhc291cmNlLWxvY2FsIl19LCJkYXRhdGFibGUtZm9vdCI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWNvcmUiLCJ2aWV3Il19LCJkYXRhdGFibGUtZm9ybWF0dGVycyI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJvZHkiLCJkYXRhdHlwZS1udW1iZXItZm9ybWF0IiwiZGF0YXR5cGUtZGF0ZS1mb3JtYXQiLCJlc2NhcGUiXX0sImRhdGF0YWJsZS1oZWFkIjp7cmVxdWlyZXM6WyJkYXRhdGFibGUtY29yZSIsInZpZXciLCJjbGFzc25hbWVtYW5hZ2VyIl19LCJkYXRhdGFibGUtaGlnaGxpZ2h0Ijp7cmVxdWlyZXM6WyJkYXRhdGFibGUtYmFzZSIsImV2ZW50LWhvdmVyIl0sc2tpbm5hYmxlOiEwfSwiZGF0YXRhYmxlLWtleW5hdiI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiXX0sImRhdGF0YWJsZS1tZXNzYWdlIjp7bGFuZzpbImVuIiwiZnIiLCJlcyIsImh1IiwiaXQiXSxyZXF1aXJlczpbImRhdGF0YWJsZS1iYXNlIl0sc2tpbm5hYmxlOiEwfSwiZGF0YXRhYmxlLW11dGFibGUiOntyZXF1aXJlczpbImRhdGF0YWJsZS1iYXNlIl19LCJkYXRhdGFibGUtcGFnaW5hdG9yIjp7bGFuZzpbImVuIiwiZnIiXSxyZXF1aXJlczpbIm1vZGVsIiwidmlldyIsInBhZ2luYXRvci1jb3JlIiwiZGF0YXRhYmxlLWZvb3QiLCJkYXRhdGFibGUtcGFnaW5hdG9yLXRlbXBsYXRlcyJdLHNraW5uYWJsZTohMH0sImRhdGF0YWJsZS1wYWdpbmF0b3ItdGVtcGxhdGVzIjp7cmVxdWlyZXM6WyJ0ZW1wbGF0ZSJdfSwiZGF0YXRhYmxlLXNjcm9sbCI6e3JlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiLCJkYXRhdGFibGUtY29sdW1uLXdpZHRocyIsImRvbS1zY3JlZW4iXSxza2lubmFibGU6ITB9LCJkYXRhdGFibGUtc29ydCI6e2xhbmc6WyJlbiIsImZyIiwiZXMiLCJodSJdLHJlcXVpcmVzOlsiZGF0YXRhYmxlLWJhc2UiXSxza2lubmFibGU6ITB9LCJkYXRhdGFibGUtdGFibGUiOntyZXF1aXJlczpbImRhdGF0YWJsZS1jb3JlIiwiZGF0YXRhYmxlLWhlYWQiLCJkYXRhdGFibGUtYm9keSIsInZpZXciLCJjbGFzc25hbWVtYW5hZ2VyIl19LGRhdGF0eXBlOnt1c2U6WyJkYXRhdHlwZS1kYXRlIiwiZGF0YXR5cGUtbnVtYmVyIiwiZGF0YXR5cGUteG1sIl19LCJkYXRhdHlwZS1kYXRlIjp7dXNlOlsiZGF0YXR5cGUtZGF0ZS1wYXJzZSIsImRhdGF0eXBlLWRhdGUtZm9ybWF0IiwiZGF0YXR5cGUtZGF0ZS1tYXRoIl19LCJkYXRhdHlwZS1kYXRlLWZvcm1hdCI6e2xhbmc6WyJhciIsImFyLUpPIiwiY2EiLCJjYS1FUyIsImRhIiwiZGEtREsiLCJkZSIsImRlLUFUIiwiZGUtREUiLCJlbCIsImVsLUdSIiwiZW4iLCJlbi1BVSIsImVuLUNBIiwiZW4tR0IiLCJlbi1JRSIsImVuLUlOIiwiZW4tSk8iLCJlbi1NWSIsImVuLU5aIiwiZW4tUEgiLCJlbi1TRyIsImVuLVVTIiwiZXMiLCJlcy1BUiIsImVzLUJPIiwiZXMtQ0wiLCJlcy1DTyIsImVzLUVDIiwiZXMtRVMiLCJlcy1NWCIsImVzLVBFIiwiZXMtUFkiLCJlcy1VUyIsImVzLVVZIiwiZXMtVkUiLCJmaSIsImZpLUZJIiwiZnIiLCJmci1CRSIsImZyLUNBIiwiZnItRlIiLCJoaSIsImhpLUlOIiwiaHUiLCJpZCIsImlkLUlEIiwiaXQiLCJpdC1JVCIsImphIiwiamEtSlAiLCJrbyIsImtvLUtSIiwibXMiLCJtcy1NWSIsIm5iIiwibmItTk8iLCJubCIsIm5sLUJFIiwibmwtTkwiLCJwbCIsInBsLVBMIiwicHQiLCJwdC1CUiIsInJvIiwicm8tUk8iLCJydSIsInJ1LVJVIiwic3YiLCJzdi1TRSIsInRoIiwidGgtVEgiLCJ0ciIsInRyLVRSIiwidmkiLCJ2aS1WTiIsInpoLUhhbnMiLCJ6aC1IYW5zLUNOIiwiemgtSGFudCIsInpoLUhhbnQtSEsiLCJ6aC1IYW50LVRXIl19LCJkYXRhdHlwZS1kYXRlLW1hdGgiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJkYXRhdHlwZS1kYXRlLXBhcnNlIjp7fSwiZGF0YXR5cGUtbnVtYmVyIjp7dXNlOlsiZGF0YXR5cGUtbnVtYmVyLXBhcnNlIiwiZGF0YXR5cGUtbnVtYmVyLWZvcm1hdCJdfSwiZGF0YXR5cGUtbnVtYmVyLWZvcm1hdCI6e30sImRhdGF0eXBlLW51bWJlci1wYXJzZSI6e3JlcXVpcmVzOlsiZXNjYXBlIl19LCJkYXRhdHlwZS14bWwiOnt1c2U6WyJkYXRhdHlwZS14bWwtcGFyc2UiLCJkYXRhdHlwZS14bWwtZm9ybWF0Il19LCJkYXRhdHlwZS14bWwtZm9ybWF0Ijp7fSwiZGF0YXR5cGUteG1sLXBhcnNlIjp7fSxkZDp7dXNlOlsiZGQtZGRtLWJhc2UiLCJkZC1kZG0iLCJkZC1kZG0tZHJvcCIsImRkLWRyYWciLCJkZC1wcm94eSIsImRkLWNvbnN0cmFpbiIsImRkLWRyb3AiLCJkZC1zY3JvbGwiLCJkZC1kZWxlZ2F0ZSJdfSwiZGQtY29uc3RyYWluIjp7cmVxdWlyZXM6WyJkZC1kcmFnIl19LCJkZC1kZG0iOntyZXF1aXJlczpbImRkLWRkbS1iYXNlIiwiZXZlbnQtcmVzaXplIl19LCJkZC1kZG0tYmFzZSI6e3JlcXVpcmVzOlsibm9kZSIsImJhc2UiLCJ5dWktdGhyb3R0bGUiLCJjbGFzc25hbWVtYW5hZ2VyIl19LCJkZC1kZG0tZHJvcCI6e3JlcXVpcmVzOlsiZGQtZGRtIl19LCJkZC1kZWxlZ2F0ZSI6e3JlcXVpcmVzOlsiZGQtZHJhZyIsImRkLWRyb3AtcGx1Z2luIiwiZXZlbnQtbW91c2VlbnRlciJdfSwiZGQtZHJhZyI6e3JlcXVpcmVzOlsiZGQtZGRtLWJhc2UiXX0sImRkLWRyb3AiOntyZXF1aXJlczpbImRkLWRyYWciLCJkZC1kZG0tZHJvcCJdfSwiZGQtZHJvcC1wbHVnaW4iOntyZXF1aXJlczpbImRkLWRyb3AiXX0sImRkLWdlc3R1cmVzIjp7Y29uZGl0aW9uOntuYW1lOiJkZC1nZXN0dXJlcyIsdHJpZ2dlcjoiZGQtZHJhZyIsdWE6InRvdWNoRW5hYmxlZCJ9LHJlcXVpcmVzOlsiZGQtZHJhZyIsImV2ZW50LXN5bnRoZXRpYyIsImV2ZW50LWdlc3R1cmVzIl19LCJkZC1wbHVnaW4iOntvcHRpb25hbDpbImRkLWNvbnN0cmFpbiIsImRkLXByb3h5Il0scmVxdWlyZXM6WyJkZC1kcmFnIl19LCJkZC1wcm94eSI6e3JlcXVpcmVzOlsiZGQtZHJhZyJdfSwiZGQtc2Nyb2xsIjp7cmVxdWlyZXM6WyJkZC1kcmFnIl19LGRpYWw6e2xhbmc6WyJlbiIsImVzIiwiaHUiXSxyZXF1aXJlczpbIndpZGdldCIsImRkLWRyYWciLCJldmVudC1tb3VzZWVudGVyIiwiZXZlbnQtbW92ZSIsImV2ZW50LWtleSIsInRyYW5zaXRpb24iLCJpbnRsIl0sc2tpbm5hYmxlOiEwfSxkb206e3VzZTpbImRvbS1iYXNlIiwiZG9tLXNjcmVlbiIsImRvbS1zdHlsZSIsInNlbGVjdG9yLW5hdGl2ZSIsInNlbGVjdG9yIl19LCJkb20tYmFzZSI6e3JlcXVpcmVzOlsiZG9tLWNvcmUiXX0sImRvbS1jb3JlIjp7cmVxdWlyZXM6WyJvb3AiLCJmZWF0dXJlcyJdfSwiZG9tLXNjcmVlbiI6e3JlcXVpcmVzOlsiZG9tLWJhc2UiLCJkb20tc3R5bGUiXX0sImRvbS1zdHlsZSI6e3JlcXVpcmVzOlsiZG9tLWJhc2UiXX0sImRvbS1zdHlsZS1pZSI6e2NvbmRpdGlvbjp7bmFtZToiZG9tLXN0eWxlLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuRmVhdHVyZXMudGVzdCxuPWUuRmVhdHVyZXMuYWRkLHI9ZS5jb25maWcud2luLGk9ZS5jb25maWcuZG9jLHM9ImRvY3VtZW50RWxlbWVudCIsbz0hMTtyZXR1cm4gbigic3R5bGUiLCJjb21wdXRlZFN0eWxlIix7dGVzdDpmdW5jdGlvbigpe3JldHVybiByJiYiZ2V0Q29tcHV0ZWRTdHlsZSJpbiByfX0pCixuKCJzdHlsZSIsIm9wYWNpdHkiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIGkmJiJvcGFjaXR5ImluIGlbc10uc3R5bGV9fSksbz0hdCgic3R5bGUiLCJvcGFjaXR5IikmJiF0KCJzdHlsZSIsImNvbXB1dGVkU3R5bGUiKSxvfSx0cmlnZ2VyOiJkb20tc3R5bGUifSxyZXF1aXJlczpbImRvbS1zdHlsZSIsImNvbG9yLWJhc2UiXX0sZHVtcDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxlZGl0b3I6e3VzZTpbImZyYW1lIiwiZWRpdG9yLXNlbGVjdGlvbiIsImV4ZWMtY29tbWFuZCIsImVkaXRvci1iYXNlIiwiZWRpdG9yLXBhcmEiLCJlZGl0b3ItYnIiLCJlZGl0b3ItYmlkaSIsImVkaXRvci10YWIiLCJjcmVhdGVsaW5rLWJhc2UiXX0sImVkaXRvci1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIiwiZnJhbWUiLCJub2RlIiwiZXhlYy1jb21tYW5kIiwiZWRpdG9yLXNlbGVjdGlvbiJdfSwiZWRpdG9yLWJpZGkiOntyZXF1aXJlczpbImVkaXRvci1iYXNlIl19LCJlZGl0b3ItYnIiOntyZXF1aXJlczpbImVkaXRvci1iYXNlIl19LCJlZGl0b3ItaW5saW5lIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSIsImNvbnRlbnQtZWRpdGFibGUiXX0sImVkaXRvci1saXN0cyI6e3JlcXVpcmVzOlsiZWRpdG9yLWJhc2UiXX0sImVkaXRvci1wYXJhIjp7cmVxdWlyZXM6WyJlZGl0b3ItcGFyYS1iYXNlIl19LCJlZGl0b3ItcGFyYS1iYXNlIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSJdfSwiZWRpdG9yLXBhcmEtaWUiOntjb25kaXRpb246e25hbWU6ImVkaXRvci1wYXJhLWllIix0cmlnZ2VyOiJlZGl0b3ItcGFyYSIsdWE6ImllIix3aGVuOiJpbnN0ZWFkIn0scmVxdWlyZXM6WyJlZGl0b3ItcGFyYS1iYXNlIl19LCJlZGl0b3Itc2VsZWN0aW9uIjp7cmVxdWlyZXM6WyJub2RlIl19LCJlZGl0b3ItdGFiIjp7cmVxdWlyZXM6WyJlZGl0b3ItYmFzZSJdfSxlc2NhcGU6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sZXZlbnQ6e2FmdGVyOlsibm9kZS1iYXNlIl0sdXNlOlsiZXZlbnQtYmFzZSIsImV2ZW50LWRlbGVnYXRlIiwiZXZlbnQtc3ludGhldGljIiwiZXZlbnQtbW91c2V3aGVlbCIsImV2ZW50LW1vdXNlZW50ZXIiLCJldmVudC1rZXkiLCJldmVudC1mb2N1cyIsImV2ZW50LXJlc2l6ZSIsImV2ZW50LWhvdmVyIiwiZXZlbnQtb3V0c2lkZSIsImV2ZW50LXRvdWNoIiwiZXZlbnQtbW92ZSIsImV2ZW50LWZsaWNrIiwiZXZlbnQtdmFsdWVjaGFuZ2UiLCJldmVudC10YXAiXX0sImV2ZW50LWJhc2UiOnthZnRlcjpbIm5vZGUtYmFzZSJdLHJlcXVpcmVzOlsiZXZlbnQtY3VzdG9tLWJhc2UiXX0sImV2ZW50LWJhc2UtaWUiOnthZnRlcjpbImV2ZW50LWJhc2UiXSxjb25kaXRpb246e25hbWU6ImV2ZW50LWJhc2UtaWUiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jJiZlLmNvbmZpZy5kb2MuaW1wbGVtZW50YXRpb247cmV0dXJuIHQmJiF0Lmhhc0ZlYXR1cmUoIkV2ZW50cyIsIjIuMCIpfSx0cmlnZ2VyOiJub2RlLWJhc2UifSxyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtY29udGV4dG1lbnUiOntyZXF1aXJlczpbImV2ZW50LXN5bnRoZXRpYyIsImRvbS1zY3JlZW4iXX0sImV2ZW50LWN1c3RvbSI6e3VzZTpbImV2ZW50LWN1c3RvbS1iYXNlIiwiZXZlbnQtY3VzdG9tLWNvbXBsZXgiXX0sImV2ZW50LWN1c3RvbS1iYXNlIjp7cmVxdWlyZXM6WyJvb3AiXX0sImV2ZW50LWN1c3RvbS1jb21wbGV4Ijp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSJdfSwiZXZlbnQtZGVsZWdhdGUiOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtZmxpY2siOntyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LXRvdWNoIiwiZXZlbnQtc3ludGhldGljIl19LCJldmVudC1mb2N1cyI6e3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19LCJldmVudC1nZXN0dXJlcyI6e3VzZTpbImV2ZW50LWZsaWNrIiwiZXZlbnQtbW92ZSJdfSwiZXZlbnQtaG92ZXIiOntyZXF1aXJlczpbImV2ZW50LW1vdXNlZW50ZXIiXX0sImV2ZW50LWtleSI6e3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19LCJldmVudC1tb3VzZWVudGVyIjp7cmVxdWlyZXM6WyJldmVudC1zeW50aGV0aWMiXX0sImV2ZW50LW1vdXNld2hlZWwiOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtbW92ZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZXZlbnQtdG91Y2giLCJldmVudC1zeW50aGV0aWMiXX0sImV2ZW50LW91dHNpZGUiOntyZXF1aXJlczpbImV2ZW50LXN5bnRoZXRpYyJdfSwiZXZlbnQtcmVzaXplIjp7cmVxdWlyZXM6WyJub2RlLWJhc2UiLCJldmVudC1zeW50aGV0aWMiXX0sImV2ZW50LXNpbXVsYXRlIjp7cmVxdWlyZXM6WyJldmVudC1iYXNlIl19LCJldmVudC1zeW50aGV0aWMiOntyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWN1c3RvbS1jb21wbGV4Il19LCJldmVudC10YXAiOntyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWJhc2UiLCJldmVudC10b3VjaCIsImV2ZW50LXN5bnRoZXRpYyJdfSwiZXZlbnQtdG91Y2giOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwiZXZlbnQtdmFsdWVjaGFuZ2UiOntyZXF1aXJlczpbImV2ZW50LWZvY3VzIiwiZXZlbnQtc3ludGhldGljIl19LCJleGVjLWNvbW1hbmQiOntyZXF1aXJlczpbImZyYW1lIl19LGZlYXR1cmVzOntyZXF1aXJlczpbInl1aS1iYXNlIl19LGZpbGU6e3JlcXVpcmVzOlsiZmlsZS1mbGFzaCIsImZpbGUtaHRtbDUiXX0sImZpbGUtZmxhc2giOntyZXF1aXJlczpbImJhc2UiXX0sImZpbGUtaHRtbDUiOntyZXF1aXJlczpbImJhc2UiXX0sZnJhbWU6e3JlcXVpcmVzOlsiYmFzZSIsIm5vZGUiLCJwbHVnaW4iLCJzZWxlY3Rvci1jc3MzIiwieXVpLXRocm90dGxlIl19LCJnZXN0dXJlLXNpbXVsYXRlIjp7cmVxdWlyZXM6WyJhc3luYy1xdWV1ZSIsImV2ZW50LXNpbXVsYXRlIiwibm9kZS1zY3JlZW4iXX0sZ2V0OntyZXF1aXJlczpbInl1aS1iYXNlIl19LGdyYXBoaWNzOntyZXF1aXJlczpbIm5vZGUiLCJldmVudC1jdXN0b20iLCJwbHVnaW5ob3N0IiwibWF0cml4IiwiY2xhc3NuYW1lbWFuYWdlciJdfSwiZ3JhcGhpY3MtY2FudmFzIjp7Y29uZGl0aW9uOntuYW1lOiJncmFwaGljcy1jYW52YXMiLHRlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcuZG9jLG49ZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmUmJmUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lPT0iY2FudmFzIixyPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT10JiZ0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKTtyZXR1cm4oIWl8fG4pJiZyJiZyLmdldENvbnRleHQmJnIuZ2V0Q29udGV4dCgiMmQiKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSxyZXF1aXJlczpbImdyYXBoaWNzIiwiY29sb3ItYmFzZSJdfSwiZ3JhcGhpY3MtY2FudmFzLWRlZmF1bHQiOntjb25kaXRpb246e25hbWU6ImdyYXBoaWNzLWNhbnZhcy1kZWZhdWx0Iix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPWUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lJiZlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZT09ImNhbnZhcyIscj10JiZ0LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9dCYmdC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik7cmV0dXJuKCFpfHxuKSYmciYmci5nZXRDb250ZXh0JiZyLmdldENvbnRleHQoIjJkIil9LHRyaWdnZXI6ImdyYXBoaWNzIn19LCJncmFwaGljcy1ncm91cCI6e3JlcXVpcmVzOlsiZ3JhcGhpY3MiXX0sImdyYXBoaWNzLXN2ZyI6e2NvbmRpdGlvbjp7bmFtZToiZ3JhcGhpY3Mtc3ZnIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPSFlLmNvbmZpZy5kZWZhdWx0R3JhcGhpY0VuZ2luZXx8ZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmUhPSJjYW52YXMiLHI9dCYmdC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxpPXQmJnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNCYXNpY1N0cnVjdHVyZSIsIjEuMSIpO3JldHVybiBpJiYobnx8IXIpfSx0cmlnZ2VyOiJncmFwaGljcyJ9LHJlcXVpcmVzOlsiZ3JhcGhpY3MiXX0sImdyYXBoaWNzLXN2Zy1kZWZhdWx0Ijp7Y29uZGl0aW9uOntuYW1lOiJncmFwaGljcy1zdmctZGVmYXVsdCIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj0hZS5jb25maWcuZGVmYXVsdEdyYXBoaWNFbmdpbmV8fGUuY29uZmlnLmRlZmF1bHRHcmFwaGljRW5naW5lIT0iY2FudmFzIixyPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT10JiZ0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKTtyZXR1cm4gaSYmKG58fCFyKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifX0sImdyYXBoaWNzLXZtbCI6e2NvbmRpdGlvbjp7bmFtZToiZ3JhcGhpY3Mtdm1sIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJuIHQmJiF0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKSYmKCFufHwhbi5nZXRDb250ZXh0fHwhbi5nZXRDb250ZXh0KCIyZCIpKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifSxyZXF1aXJlczpbImdyYXBoaWNzIiwiY29sb3ItYmFzZSJdfSwiZ3JhcGhpY3Mtdm1sLWRlZmF1bHQiOntjb25kaXRpb246e25hbWU6ImdyYXBoaWNzLXZtbC1kZWZhdWx0Iix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJuIHQmJiF0LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmUiLCIxLjEiKSYmKCFufHwhbi5nZXRDb250ZXh0fHwhbi5nZXRDb250ZXh0KCIyZCIpKX0sdHJpZ2dlcjoiZ3JhcGhpY3MifX0saGFuZGxlYmFyczp7dXNlOlsiaGFuZGxlYmFycy1jb21waWxlciJdfSwiaGFuZGxlYmFycy1iYXNlIjp7cmVxdWlyZXM6W119LCJoYW5kbGViYXJzLWNvbXBpbGVyIjp7cmVxdWlyZXM6WyJoYW5kbGViYXJzLWJhc2UiXX0saGlnaGxpZ2h0Ont1c2U6WyJoaWdobGlnaHQtYmFzZSIsImhpZ2hsaWdodC1hY2NlbnRmb2xkIl19LCJoaWdobGlnaHQtYWNjZW50Zm9sZCI6e3JlcXVpcmVzOlsiaGlnaGxpZ2h0LWJhc2UiLCJ0ZXh0LWFjY2VudGZvbGQiXX0sImhpZ2hsaWdodC1iYXNlIjp7cmVxdWlyZXM6WyJhcnJheS1leHRyYXMiLCJjbGFzc25hbWVtYW5hZ2VyIiwiZXNjYXBlIiwidGV4dC13b3JkYnJlYWsiXX0saGlzdG9yeTp7dXNlOlsiaGlzdG9yeS1iYXNlIiwiaGlzdG9yeS1oYXNoIiwiaGlzdG9yeS1odG1sNSJdfSwiaGlzdG9yeS1iYXNlIjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tY29tcGxleCJdfSwiaGlzdG9yeS1oYXNoIjp7YWZ0ZXI6WyJoaXN0b3J5LWh0bWw1Il0scmVxdWlyZXM6WyJldmVudC1zeW50aGV0aWMiLCJoaXN0b3J5LWJhc2UiLCJ5dWktbGF0ZXIiXX0sImhpc3RvcnktaGFzaC1pZSI6e2NvbmRpdGlvbjp7bmFtZToiaGlzdG9yeS1oYXNoLWllIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmRvY3VtZW50TW9kZTtyZXR1cm4gZS5VQS5pZSYmKCEoIm9uaGFzaGNoYW5nZSJpbiBlLmNvbmZpZy53aW4pfHwhdHx8dDw4KX0sdHJpZ2dlcjoiaGlzdG9yeS1oYXNoIn0scmVxdWlyZXM6WyJoaXN0b3J5LWhhc2giLCJub2RlLWJhc2UiXX0sImhpc3RvcnktaHRtbDUiOntvcHRpb25hbDpbImpzb24iXSxyZXF1aXJlczpbImV2ZW50LWJhc2UiLCJoaXN0b3J5LWJhc2UiLCJub2RlLWJhc2UiCl19LGltYWdlbG9hZGVyOntyZXF1aXJlczpbImJhc2UtYmFzZSIsIm5vZGUtc3R5bGUiLCJub2RlLXNjcmVlbiJdfSxpbnRsOntyZXF1aXJlczpbImludGwtYmFzZSIsImV2ZW50LWN1c3RvbSJdfSwiaW50bC1iYXNlIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxpbzp7dXNlOlsiaW8tYmFzZSIsImlvLXhkciIsImlvLWZvcm0iLCJpby11cGxvYWQtaWZyYW1lIiwiaW8tcXVldWUiXX0sImlvLWJhc2UiOntyZXF1aXJlczpbImV2ZW50LWN1c3RvbS1iYXNlIiwicXVlcnlzdHJpbmctc3RyaW5naWZ5LXNpbXBsZSJdfSwiaW8tZm9ybSI6e3JlcXVpcmVzOlsiaW8tYmFzZSIsIm5vZGUtYmFzZSJdfSwiaW8tbm9kZWpzIjp7Y29uZGl0aW9uOntuYW1lOiJpby1ub2RlanMiLHRyaWdnZXI6ImlvLWJhc2UiLHVhOiJub2RlanMifSxyZXF1aXJlczpbImlvLWJhc2UiXX0sImlvLXF1ZXVlIjp7cmVxdWlyZXM6WyJpby1iYXNlIiwicXVldWUtcHJvbW90ZSJdfSwiaW8tdXBsb2FkLWlmcmFtZSI6e3JlcXVpcmVzOlsiaW8tYmFzZSIsIm5vZGUtYmFzZSJdfSwiaW8teGRyIjp7cmVxdWlyZXM6WyJpby1iYXNlIiwiZGF0YXR5cGUteG1sLXBhcnNlIl19LGpzb246e3VzZTpbImpzb24tcGFyc2UiLCJqc29uLXN0cmluZ2lmeSJdfSwianNvbi1wYXJzZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sImpzb24tcGFyc2Utc2hpbSI6e2NvbmRpdGlvbjp7bmFtZToianNvbi1wYXJzZS1zaGltIix0ZXN0OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGkoZSx0KXtyZXR1cm4gZT09PSJvayI/ITA6dH12YXIgdD1lLmNvbmZpZy5nbG9iYWwuSlNPTixuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KT09PSJbb2JqZWN0IEpTT05dIiYmdCxyPWUuY29uZmlnLnVzZU5hdGl2ZUpTT05QYXJzZSE9PSExJiYhIW47aWYocil0cnl7cj1uLnBhcnNlKCd7Im9rIjpmYWxzZX0nLGkpLm9rfWNhdGNoKHMpe3I9ITF9cmV0dXJuIXJ9LHRyaWdnZXI6Impzb24tcGFyc2UifSxyZXF1aXJlczpbImpzb24tcGFyc2UiXX0sImpzb24tc3RyaW5naWZ5Ijp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwianNvbi1zdHJpbmdpZnktc2hpbSI6e2NvbmRpdGlvbjp7bmFtZToianNvbi1zdHJpbmdpZnktc2hpbSIsdGVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5nbG9iYWwuSlNPTixuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KT09PSJbb2JqZWN0IEpTT05dIiYmdCxyPWUuY29uZmlnLnVzZU5hdGl2ZUpTT05TdHJpbmdpZnkhPT0hMSYmISFuO2lmKHIpdHJ5e3I9IjAiPT09bi5zdHJpbmdpZnkoMCl9Y2F0Y2goaSl7cj0hMX1yZXR1cm4hcn0sdHJpZ2dlcjoianNvbi1zdHJpbmdpZnkifSxyZXF1aXJlczpbImpzb24tc3RyaW5naWZ5Il19LGpzb25wOntyZXF1aXJlczpbImdldCIsIm9vcCJdfSwianNvbnAtdXJsIjp7cmVxdWlyZXM6WyJqc29ucCJdfSwibGF6eS1tb2RlbC1saXN0Ijp7cmVxdWlyZXM6WyJtb2RlbC1saXN0Il19LGxvYWRlcjp7dXNlOlsibG9hZGVyLWJhc2UiLCJsb2FkZXItcm9sbHVwIiwibG9hZGVyLXl1aTMiXX0sImxvYWRlci1iYXNlIjp7cmVxdWlyZXM6WyJnZXQiLCJmZWF0dXJlcyJdfSwibG9hZGVyLXJvbGx1cCI6e3JlcXVpcmVzOlsibG9hZGVyLWJhc2UiXX0sImxvYWRlci15dWkzIjp7cmVxdWlyZXM6WyJsb2FkZXItYmFzZSJdfSxtYXRyaXg6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sbW9kZWw6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsImVzY2FwZSIsImpzb24tcGFyc2UiXX0sIm1vZGVsLWxpc3QiOntyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsImFycmF5LWludm9rZSIsImFycmF5bGlzdCIsImJhc2UtYnVpbGQiLCJlc2NhcGUiLCJqc29uLXBhcnNlIiwibW9kZWwiXX0sIm1vZGVsLXN5bmMtbG9jYWwiOntyZXF1aXJlczpbIm1vZGVsIiwianNvbi1zdHJpbmdpZnkiXX0sIm1vZGVsLXN5bmMtcmVzdCI6e3JlcXVpcmVzOlsibW9kZWwiLCJpby1iYXNlIiwianNvbi1zdHJpbmdpZnkiXX0sbm9kZTp7dXNlOlsibm9kZS1iYXNlIiwibm9kZS1ldmVudC1kZWxlZ2F0ZSIsIm5vZGUtcGx1Z2luaG9zdCIsIm5vZGUtc2NyZWVuIiwibm9kZS1zdHlsZSJdfSwibm9kZS1iYXNlIjp7cmVxdWlyZXM6WyJldmVudC1iYXNlIiwibm9kZS1jb3JlIiwiZG9tLWJhc2UiLCJkb20tc3R5bGUiXX0sIm5vZGUtY29yZSI6e3JlcXVpcmVzOlsiZG9tLWNvcmUiLCJzZWxlY3RvciJdfSwibm9kZS1ldmVudC1kZWxlZ2F0ZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZXZlbnQtZGVsZWdhdGUiXX0sIm5vZGUtZXZlbnQtaHRtbDUiOntyZXF1aXJlczpbIm5vZGUtYmFzZSJdfSwibm9kZS1ldmVudC1zaW11bGF0ZSI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiZXZlbnQtc2ltdWxhdGUiLCJnZXN0dXJlLXNpbXVsYXRlIl19LCJub2RlLWZsaWNrIjp7cmVxdWlyZXM6WyJjbGFzc25hbWVtYW5hZ2VyIiwidHJhbnNpdGlvbiIsImV2ZW50LWZsaWNrIiwicGx1Z2luIl0sc2tpbm5hYmxlOiEwfSwibm9kZS1mb2N1c21hbmFnZXIiOntyZXF1aXJlczpbImF0dHJpYnV0ZSIsIm5vZGUiLCJwbHVnaW4iLCJub2RlLWV2ZW50LXNpbXVsYXRlIiwiZXZlbnQta2V5IiwiZXZlbnQtZm9jdXMiXX0sIm5vZGUtbG9hZCI6e3JlcXVpcmVzOlsibm9kZS1iYXNlIiwiaW8tYmFzZSJdfSwibm9kZS1tZW51bmF2Ijp7cmVxdWlyZXM6WyJub2RlIiwiY2xhc3NuYW1lbWFuYWdlciIsInBsdWdpbiIsIm5vZGUtZm9jdXNtYW5hZ2VyIl0sc2tpbm5hYmxlOiEwfSwibm9kZS1wbHVnaW5ob3N0Ijp7cmVxdWlyZXM6WyJub2RlLWJhc2UiLCJwbHVnaW5ob3N0Il19LCJub2RlLXNjcmVlbiI6e3JlcXVpcmVzOlsiZG9tLXNjcmVlbiIsIm5vZGUtYmFzZSJdfSwibm9kZS1zY3JvbGwtaW5mbyI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiYmFzZS1idWlsZCIsImV2ZW50LXJlc2l6ZSIsIm5vZGUtcGx1Z2luaG9zdCIsInBsdWdpbiIsInNlbGVjdG9yIl19LCJub2RlLXN0eWxlIjp7cmVxdWlyZXM6WyJkb20tc3R5bGUiLCJub2RlLWJhc2UiXX0sb29wOntyZXF1aXJlczpbInl1aS1iYXNlIl19LG92ZXJsYXk6e3JlcXVpcmVzOlsid2lkZ2V0Iiwid2lkZ2V0LXN0ZG1vZCIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1wb3NpdGlvbi1hbGlnbiIsIndpZGdldC1zdGFjayIsIndpZGdldC1wb3NpdGlvbi1jb25zdHJhaW4iXSxza2lubmFibGU6ITB9LHBhZ2luYXRvcjp7cmVxdWlyZXM6WyJwYWdpbmF0b3ItY29yZSJdfSwicGFnaW5hdG9yLWNvcmUiOntyZXF1aXJlczpbImJhc2UiXX0sInBhZ2luYXRvci11cmwiOntyZXF1aXJlczpbInBhZ2luYXRvciJdfSxwYW5lbDp7cmVxdWlyZXM6WyJ3aWRnZXQiLCJ3aWRnZXQtYXV0b2hpZGUiLCJ3aWRnZXQtYnV0dG9ucyIsIndpZGdldC1tb2RhbGl0eSIsIndpZGdldC1wb3NpdGlvbiIsIndpZGdldC1wb3NpdGlvbi1hbGlnbiIsIndpZGdldC1wb3NpdGlvbi1jb25zdHJhaW4iLCJ3aWRnZXQtc3RhY2siLCJ3aWRnZXQtc3RkbW9kIl0sc2tpbm5hYmxlOiEwfSxwYXJhbGxlbDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxwamF4OntyZXF1aXJlczpbInBqYXgtYmFzZSIsInBqYXgtY29udGVudCJdfSwicGpheC1iYXNlIjp7cmVxdWlyZXM6WyJjbGFzc25hbWVtYW5hZ2VyIiwibm9kZS1ldmVudC1kZWxlZ2F0ZSIsInJvdXRlciJdfSwicGpheC1jb250ZW50Ijp7cmVxdWlyZXM6WyJpby1iYXNlIiwibm9kZS1iYXNlIiwicm91dGVyIl19LCJwamF4LXBsdWdpbiI6e3JlcXVpcmVzOlsibm9kZS1wbHVnaW5ob3N0IiwicGpheCIsInBsdWdpbiJdfSxwbHVnaW46e3JlcXVpcmVzOlsiYmFzZS1iYXNlIl19LHBsdWdpbmhvc3Q6e3VzZTpbInBsdWdpbmhvc3QtYmFzZSIsInBsdWdpbmhvc3QtY29uZmlnIl19LCJwbHVnaW5ob3N0LWJhc2UiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJwbHVnaW5ob3N0LWNvbmZpZyI6e3JlcXVpcmVzOlsicGx1Z2luaG9zdC1iYXNlIl19LHByb21pc2U6e3JlcXVpcmVzOlsidGltZXJzIl19LHF1ZXJ5c3RyaW5nOnt1c2U6WyJxdWVyeXN0cmluZy1wYXJzZSIsInF1ZXJ5c3RyaW5nLXN0cmluZ2lmeSJdfSwicXVlcnlzdHJpbmctcGFyc2UiOntyZXF1aXJlczpbInl1aS1iYXNlIiwiYXJyYXktZXh0cmFzIl19LCJxdWVyeXN0cmluZy1wYXJzZS1zaW1wbGUiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJxdWVyeXN0cmluZy1zdHJpbmdpZnkiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJxdWVyeXN0cmluZy1zdHJpbmdpZnktc2ltcGxlIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwicXVldWUtcHJvbW90ZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sInJhbmdlLXNsaWRlciI6e3JlcXVpcmVzOlsic2xpZGVyLWJhc2UiLCJzbGlkZXItdmFsdWUtcmFuZ2UiLCJjbGlja2FibGUtcmFpbCJdfSxyZWNvcmRzZXQ6e3VzZTpbInJlY29yZHNldC1iYXNlIiwicmVjb3Jkc2V0LXNvcnQiLCJyZWNvcmRzZXQtZmlsdGVyIiwicmVjb3Jkc2V0LWluZGV4ZXIiXX0sInJlY29yZHNldC1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIiwiYXJyYXlsaXN0Il19LCJyZWNvcmRzZXQtZmlsdGVyIjp7cmVxdWlyZXM6WyJyZWNvcmRzZXQtYmFzZSIsImFycmF5LWV4dHJhcyIsInBsdWdpbiJdfSwicmVjb3Jkc2V0LWluZGV4ZXIiOntyZXF1aXJlczpbInJlY29yZHNldC1iYXNlIiwicGx1Z2luIl19LCJyZWNvcmRzZXQtc29ydCI6e3JlcXVpcmVzOlsiYXJyYXlzb3J0IiwicmVjb3Jkc2V0LWJhc2UiLCJwbHVnaW4iXX0scmVzaXplOnt1c2U6WyJyZXNpemUtYmFzZSIsInJlc2l6ZS1wcm94eSIsInJlc2l6ZS1jb25zdHJhaW4iXX0sInJlc2l6ZS1iYXNlIjp7cmVxdWlyZXM6WyJiYXNlIiwid2lkZ2V0IiwiZXZlbnQiLCJvb3AiLCJkZC1kcmFnIiwiZGQtZGVsZWdhdGUiLCJkZC1kcm9wIl0sc2tpbm5hYmxlOiEwfSwicmVzaXplLWNvbnN0cmFpbiI6e3JlcXVpcmVzOlsicGx1Z2luIiwicmVzaXplLWJhc2UiXX0sInJlc2l6ZS1wbHVnaW4iOntvcHRpb25hbDpbInJlc2l6ZS1jb25zdHJhaW4iXSxyZXF1aXJlczpbInJlc2l6ZS1iYXNlIiwicGx1Z2luIl19LCJyZXNpemUtcHJveHkiOntyZXF1aXJlczpbInBsdWdpbiIsInJlc2l6ZS1iYXNlIl19LHJvdXRlcjp7b3B0aW9uYWw6WyJxdWVyeXN0cmluZy1wYXJzZSJdLHJlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwiYmFzZS1idWlsZCIsImhpc3RvcnkiXX0sc2Nyb2xsdmlldzp7cmVxdWlyZXM6WyJzY3JvbGx2aWV3LWJhc2UiLCJzY3JvbGx2aWV3LXNjcm9sbGJhcnMiXX0sInNjcm9sbHZpZXctYmFzZSI6e3JlcXVpcmVzOlsid2lkZ2V0IiwiZXZlbnQtZ2VzdHVyZXMiLCJldmVudC1tb3VzZXdoZWVsIiwidHJhbnNpdGlvbiJdLHNraW5uYWJsZTohMH0sInNjcm9sbHZpZXctYmFzZS1pZSI6e2NvbmRpdGlvbjp7bmFtZToic2Nyb2xsdmlldy1iYXNlLWllIix0cmlnZ2VyOiJzY3JvbGx2aWV3LWJhc2UiLHVhOiJpZSJ9LHJlcXVpcmVzOlsic2Nyb2xsdmlldy1iYXNlIl19LCJzY3JvbGx2aWV3LWxpc3QiOntyZXF1aXJlczpbInBsdWdpbiIsImNsYXNzbmFtZW1hbmFnZXIiXSxza2lubmFibGU6ITB9LCJzY3JvbGx2aWV3LXBhZ2luYXRvciI6e3JlcXVpcmVzOlsicGx1Z2luIiwiY2xhc3NuYW1lbWFuYWdlciJdfSwic2Nyb2xsdmlldy1zY3JvbGxiYXJzIjp7cmVxdWlyZXM6WyJjbGFzc25hbWVtYW5hZ2VyIiwidHJhbnNpdGlvbiIsInBsdWdpbiJdLHNraW5uYWJsZTohMH0sc2VsZWN0b3I6e3JlcXVpcmVzOlsic2VsZWN0b3ItbmF0aXZlIl19LCJzZWxlY3Rvci1jc3MyIjp7Y29uZGl0aW9uOntuYW1lOiJzZWxlY3Rvci1jc3MyIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQmJiEoInF1ZXJ5U2VsZWN0b3JBbGwiaW4gdCk7cmV0dXJuIG59LHRyaWdnZXI6InNlbGVjdG9yIn0scmVxdWlyZXM6WyJzZWxlY3Rvci1uYXRpdmUiXX0sInNlbGVjdG9yLWNzczMiOntyZXF1aXJlczpbInNlbGVjdG9yLW5hdGl2ZSIsInNlbGVjdG9yLWNzczIiXX0sInNlbGVjdG9yLW5hdGl2ZSI6e3JlcXVpcmVzOlsiZG9tLWJhc2UiXX0sInNlcmllcy1hcmVhIgo6e3JlcXVpcmVzOlsic2VyaWVzLWNhcnRlc2lhbiIsInNlcmllcy1maWxsLXV0aWwiXX0sInNlcmllcy1hcmVhLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLWFyZWEiXX0sInNlcmllcy1hcmVhc3BsaW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtYXJlYSIsInNlcmllcy1jdXJ2ZS11dGlsIl19LCJzZXJpZXMtYXJlYXNwbGluZS1zdGFja2VkIjp7cmVxdWlyZXM6WyJzZXJpZXMtc3RhY2tlZCIsInNlcmllcy1hcmVhc3BsaW5lIl19LCJzZXJpZXMtYmFyIjp7cmVxdWlyZXM6WyJzZXJpZXMtbWFya2VyIiwic2VyaWVzLWhpc3RvZ3JhbS1iYXNlIl19LCJzZXJpZXMtYmFyLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLWJhciJdfSwic2VyaWVzLWJhc2UiOntyZXF1aXJlczpbImdyYXBoaWNzIiwiYXhpcy1iYXNlIl19LCJzZXJpZXMtY2FuZGxlc3RpY2siOntyZXF1aXJlczpbInNlcmllcy1yYW5nZSJdfSwic2VyaWVzLWNhcnRlc2lhbiI6e3JlcXVpcmVzOlsic2VyaWVzLWJhc2UiXX0sInNlcmllcy1jb2x1bW4iOntyZXF1aXJlczpbInNlcmllcy1tYXJrZXIiLCJzZXJpZXMtaGlzdG9ncmFtLWJhc2UiXX0sInNlcmllcy1jb2x1bW4tc3RhY2tlZCI6e3JlcXVpcmVzOlsic2VyaWVzLXN0YWNrZWQiLCJzZXJpZXMtY29sdW1uIl19LCJzZXJpZXMtY29tYm8iOntyZXF1aXJlczpbInNlcmllcy1jYXJ0ZXNpYW4iLCJzZXJpZXMtbGluZS11dGlsIiwic2VyaWVzLXBsb3QtdXRpbCIsInNlcmllcy1maWxsLXV0aWwiXX0sInNlcmllcy1jb21iby1zdGFja2VkIjp7cmVxdWlyZXM6WyJzZXJpZXMtc3RhY2tlZCIsInNlcmllcy1jb21ibyJdfSwic2VyaWVzLWNvbWJvc3BsaW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtY29tYm8iLCJzZXJpZXMtY3VydmUtdXRpbCJdfSwic2VyaWVzLWNvbWJvc3BsaW5lLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1jb21iby1zdGFja2VkIiwic2VyaWVzLWN1cnZlLXV0aWwiXX0sInNlcmllcy1jdXJ2ZS11dGlsIjp7fSwic2VyaWVzLWZpbGwtdXRpbCI6e30sInNlcmllcy1oaXN0b2dyYW0tYmFzZSI6e3JlcXVpcmVzOlsic2VyaWVzLWNhcnRlc2lhbiIsInNlcmllcy1wbG90LXV0aWwiXX0sInNlcmllcy1saW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtY2FydGVzaWFuIiwic2VyaWVzLWxpbmUtdXRpbCJdfSwic2VyaWVzLWxpbmUtc3RhY2tlZCI6e3JlcXVpcmVzOlsic2VyaWVzLXN0YWNrZWQiLCJzZXJpZXMtbGluZSJdfSwic2VyaWVzLWxpbmUtdXRpbCI6e30sInNlcmllcy1tYXJrZXIiOntyZXF1aXJlczpbInNlcmllcy1jYXJ0ZXNpYW4iLCJzZXJpZXMtcGxvdC11dGlsIl19LCJzZXJpZXMtbWFya2VyLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLW1hcmtlciJdfSwic2VyaWVzLW9obGMiOntyZXF1aXJlczpbInNlcmllcy1yYW5nZSJdfSwic2VyaWVzLXBpZSI6e3JlcXVpcmVzOlsic2VyaWVzLWJhc2UiLCJzZXJpZXMtcGxvdC11dGlsIl19LCJzZXJpZXMtcGxvdC11dGlsIjp7fSwic2VyaWVzLXJhbmdlIjp7cmVxdWlyZXM6WyJzZXJpZXMtY2FydGVzaWFuIl19LCJzZXJpZXMtc3BsaW5lIjp7cmVxdWlyZXM6WyJzZXJpZXMtbGluZSIsInNlcmllcy1jdXJ2ZS11dGlsIl19LCJzZXJpZXMtc3BsaW5lLXN0YWNrZWQiOntyZXF1aXJlczpbInNlcmllcy1zdGFja2VkIiwic2VyaWVzLXNwbGluZSJdfSwic2VyaWVzLXN0YWNrZWQiOntyZXF1aXJlczpbImF4aXMtc3RhY2tlZCJdfSwic2hpbS1wbHVnaW4iOntyZXF1aXJlczpbIm5vZGUtc3R5bGUiLCJub2RlLXBsdWdpbmhvc3QiXX0sc2xpZGVyOnt1c2U6WyJzbGlkZXItYmFzZSIsInNsaWRlci12YWx1ZS1yYW5nZSIsImNsaWNrYWJsZS1yYWlsIiwicmFuZ2Utc2xpZGVyIl19LCJzbGlkZXItYmFzZSI6e3JlcXVpcmVzOlsid2lkZ2V0IiwiZGQtY29uc3RyYWluIiwiZXZlbnQta2V5Il0sc2tpbm5hYmxlOiEwfSwic2xpZGVyLXZhbHVlLXJhbmdlIjp7cmVxdWlyZXM6WyJzbGlkZXItYmFzZSJdfSxzb3J0YWJsZTp7cmVxdWlyZXM6WyJkZC1kZWxlZ2F0ZSIsImRkLWRyb3AtcGx1Z2luIiwiZGQtcHJveHkiXX0sInNvcnRhYmxlLXNjcm9sbCI6e3JlcXVpcmVzOlsiZGQtc2Nyb2xsIiwic29ydGFibGUiXX0sc3R5bGVzaGVldDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSxzdWJzdGl0dXRlOntvcHRpb25hbDpbImR1bXAiXSxyZXF1aXJlczpbInl1aS1iYXNlIl19LHN3Zjp7cmVxdWlyZXM6WyJldmVudC1jdXN0b20iLCJub2RlIiwic3dmZGV0ZWN0IiwiZXNjYXBlIl19LHN3ZmRldGVjdDp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSx0YWJ2aWV3OntyZXF1aXJlczpbIndpZGdldCIsIndpZGdldC1wYXJlbnQiLCJ3aWRnZXQtY2hpbGQiLCJ0YWJ2aWV3LWJhc2UiLCJub2RlLXBsdWdpbmhvc3QiLCJub2RlLWZvY3VzbWFuYWdlciJdLHNraW5uYWJsZTohMH0sInRhYnZpZXctYmFzZSI6e3JlcXVpcmVzOlsibm9kZS1ldmVudC1kZWxlZ2F0ZSIsImNsYXNzbmFtZW1hbmFnZXIiXX0sInRhYnZpZXctcGx1Z2luIjp7cmVxdWlyZXM6WyJ0YWJ2aWV3LWJhc2UiXX0sdGVtcGxhdGU6e3VzZTpbInRlbXBsYXRlLWJhc2UiLCJ0ZW1wbGF0ZS1taWNybyJdfSwidGVtcGxhdGUtYmFzZSI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sInRlbXBsYXRlLW1pY3JvIjp7cmVxdWlyZXM6WyJlc2NhcGUiXX0sdGVzdDp7cmVxdWlyZXM6WyJldmVudC1zaW11bGF0ZSIsImV2ZW50LWN1c3RvbSIsImpzb24tc3RyaW5naWZ5Il19LCJ0ZXN0LWNvbnNvbGUiOntyZXF1aXJlczpbImNvbnNvbGUtZmlsdGVycyIsInRlc3QiLCJhcnJheS1leHRyYXMiXSxza2lubmFibGU6ITB9LHRleHQ6e3VzZTpbInRleHQtYWNjZW50Zm9sZCIsInRleHQtd29yZGJyZWFrIl19LCJ0ZXh0LWFjY2VudGZvbGQiOntyZXF1aXJlczpbImFycmF5LWV4dHJhcyIsInRleHQtZGF0YS1hY2NlbnRmb2xkIl19LCJ0ZXh0LWRhdGEtYWNjZW50Zm9sZCI6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sInRleHQtZGF0YS13b3JkYnJlYWsiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJ0ZXh0LXdvcmRicmVhayI6e3JlcXVpcmVzOlsiYXJyYXktZXh0cmFzIiwidGV4dC1kYXRhLXdvcmRicmVhayJdfSx0aW1lcnM6e3JlcXVpcmVzOlsieXVpLWJhc2UiXX0sdHJhbnNpdGlvbjp7cmVxdWlyZXM6WyJub2RlLXN0eWxlIl19LCJ0cmFuc2l0aW9uLXRpbWVyIjp7Y29uZGl0aW9uOntuYW1lOiJ0cmFuc2l0aW9uLXRpbWVyIix0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLmRvYyxuPXQ/dC5kb2N1bWVudEVsZW1lbnQ6bnVsbCxyPSEwO3JldHVybiBuJiZuLnN0eWxlJiYocj0hKCJNb3pUcmFuc2l0aW9uImluIG4uc3R5bGV8fCJXZWJraXRUcmFuc2l0aW9uImluIG4uc3R5bGV8fCJ0cmFuc2l0aW9uImluIG4uc3R5bGUpKSxyfSx0cmlnZ2VyOiJ0cmFuc2l0aW9uIn0scmVxdWlyZXM6WyJ0cmFuc2l0aW9uIl19LHRyZWU6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsInRyZWUtbm9kZSJdfSwidHJlZS1sYWJlbGFibGUiOntyZXF1aXJlczpbInRyZWUiXX0sInRyZWUtbGF6eSI6e3JlcXVpcmVzOlsiYmFzZS1wbHVnaW5ob3N0IiwicGx1Z2luIiwidHJlZSJdfSwidHJlZS1ub2RlIjp7fSwidHJlZS1vcGVuYWJsZSI6e3JlcXVpcmVzOlsidHJlZSJdfSwidHJlZS1zZWxlY3RhYmxlIjp7cmVxdWlyZXM6WyJ0cmVlIl19LCJ0cmVlLXNvcnRhYmxlIjp7cmVxdWlyZXM6WyJ0cmVlIl19LHVwbG9hZGVyOntyZXF1aXJlczpbInVwbG9hZGVyLWh0bWw1IiwidXBsb2FkZXItZmxhc2giXX0sInVwbG9hZGVyLWZsYXNoIjp7cmVxdWlyZXM6WyJzd2ZkZXRlY3QiLCJlc2NhcGUiLCJ3aWRnZXQiLCJiYXNlIiwiY3NzYnV0dG9uIiwibm9kZSIsImV2ZW50LWN1c3RvbSIsInVwbG9hZGVyLXF1ZXVlIl19LCJ1cGxvYWRlci1odG1sNSI6e3JlcXVpcmVzOlsid2lkZ2V0Iiwibm9kZS1ldmVudC1zaW11bGF0ZSIsImZpbGUtaHRtbDUiLCJ1cGxvYWRlci1xdWV1ZSJdfSwidXBsb2FkZXItcXVldWUiOntyZXF1aXJlczpbImJhc2UiXX0sdmlldzp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwibm9kZS1ldmVudC1kZWxlZ2F0ZSJdfSwidmlldy1ub2RlLW1hcCI6e3JlcXVpcmVzOlsidmlldyJdfSx3aWRnZXQ6e3VzZTpbIndpZGdldC1iYXNlIiwid2lkZ2V0LWh0bWxwYXJzZXIiLCJ3aWRnZXQtc2tpbiIsIndpZGdldC11aWV2ZW50cyJdfSwid2lkZ2V0LWFuaW0iOntyZXF1aXJlczpbImFuaW0tYmFzZSIsInBsdWdpbiIsIndpZGdldCJdfSwid2lkZ2V0LWF1dG9oaWRlIjp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwiZXZlbnQta2V5IiwiZXZlbnQtb3V0c2lkZSIsIndpZGdldCJdfSwid2lkZ2V0LWJhc2UiOntyZXF1aXJlczpbImF0dHJpYnV0ZSIsImJhc2UtYmFzZSIsImJhc2UtcGx1Z2luaG9zdCIsImNsYXNzbmFtZW1hbmFnZXIiLCJldmVudC1mb2N1cyIsIm5vZGUtYmFzZSIsIm5vZGUtc3R5bGUiXSxza2lubmFibGU6ITB9LCJ3aWRnZXQtYmFzZS1pZSI6e2NvbmRpdGlvbjp7bmFtZToid2lkZ2V0LWJhc2UtaWUiLHRyaWdnZXI6IndpZGdldC1iYXNlIix1YToiaWUifSxyZXF1aXJlczpbIndpZGdldC1iYXNlIl19LCJ3aWRnZXQtYnV0dG9ucyI6e3JlcXVpcmVzOlsiYnV0dG9uLXBsdWdpbiIsImNzc2J1dHRvbiIsIndpZGdldC1zdGRtb2QiXX0sIndpZGdldC1jaGlsZCI6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsIndpZGdldCJdfSwid2lkZ2V0LWh0bWxwYXJzZXIiOntyZXF1aXJlczpbIndpZGdldC1iYXNlIl19LCJ3aWRnZXQtbW9kYWxpdHkiOntyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJldmVudC1vdXRzaWRlIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwid2lkZ2V0LXBhcmVudCI6e3JlcXVpcmVzOlsiYXJyYXlsaXN0IiwiYmFzZS1idWlsZCIsIndpZGdldCJdfSwid2lkZ2V0LXBvc2l0aW9uIjp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwibm9kZS1zY3JlZW4iLCJ3aWRnZXQiXX0sIndpZGdldC1wb3NpdGlvbi1hbGlnbiI6e3JlcXVpcmVzOlsid2lkZ2V0LXBvc2l0aW9uIl19LCJ3aWRnZXQtcG9zaXRpb24tY29uc3RyYWluIjp7cmVxdWlyZXM6WyJ3aWRnZXQtcG9zaXRpb24iXX0sIndpZGdldC1za2luIjp7cmVxdWlyZXM6WyJ3aWRnZXQtYmFzZSJdfSwid2lkZ2V0LXN0YWNrIjp7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwid2lkZ2V0Il0sc2tpbm5hYmxlOiEwfSwid2lkZ2V0LXN0ZG1vZCI6e3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsIndpZGdldCJdfSwid2lkZ2V0LXVpZXZlbnRzIjp7cmVxdWlyZXM6WyJub2RlLWV2ZW50LWRlbGVnYXRlIiwid2lkZ2V0LWJhc2UiXX0seXFsOntyZXF1aXJlczpbIm9vcCJdfSwieXFsLWpzb25wIjp7Y29uZGl0aW9uOntuYW1lOiJ5cWwtanNvbnAiLHRlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIWUuVUEubm9kZWpzJiYhZS5VQS53aW5qc30sdHJpZ2dlcjoieXFsIn0scmVxdWlyZXM6WyJ5cWwiLCJqc29ucCIsImpzb25wLXVybCJdfSwieXFsLW5vZGVqcyI6e2NvbmRpdGlvbjp7bmFtZToieXFsLW5vZGVqcyIsdHJpZ2dlcjoieXFsIix1YToibm9kZWpzIn0scmVxdWlyZXM6WyJ5cWwiXX0sInlxbC13aW5qcyI6e2NvbmRpdGlvbjp7bmFtZToieXFsLXdpbmpzIix0cmlnZ2VyOiJ5cWwiLHVhOiJ3aW5qcyJ9LHJlcXVpcmVzOlsieXFsIl19LHl1aTp7fSwieXVpLWJhc2UiOnt9LCJ5dWktbGF0ZXIiOntyZXF1aXJlczpbInl1aS1iYXNlIl19LCJ5dWktbG9nIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSwieXVpLXRocm90dGxlIjp7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfX0pLFlVSS5FbnZbZS52ZXJzaW9uXS5tZDU9IjQ1MzU3YmIxMWVkZGY3ZmQwYTg5YzBiNzU2NTk5ZGYyIn0sIjMuMTcuMiIse3JlcXVpcmVzOlsibG9hZGVyLWJhc2UiXX0pLFlVSS5hZGQoInl1aSIsZnVuY3Rpb24oZSx0KXt9LCIzLjE3LjIiLHt1c2U6WyJ5dWktYmFzZSIsImdldCIsImZlYXR1cmVzIiwiaW50bC1iYXNlIiwieXVpLWxvZyIsInl1aS1sYXRlciIsImxvYWRlci1iYXNlIiwibG9hZGVyLXJvbGx1cCIKLCJsb2FkZXIteXVpMyJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJvb3AiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gYSh0LG4saSxzLG8pe2lmKHQmJnRbb10mJnQhPT1lKXJldHVybiB0W29dLmNhbGwodCxuLGkpO3N3aXRjaChyLnRlc3QodCkpe2Nhc2UgMTpyZXR1cm4gcltvXSh0LG4saSk7Y2FzZSAyOnJldHVybiByW29dKGUuQXJyYXkodCwwLCEwKSxuLGkpO2RlZmF1bHQ6cmV0dXJuIGUuT2JqZWN0W29dKHQsbixpLHMpfX12YXIgbj1lLkxhbmcscj1lLkFycmF5LGk9T2JqZWN0LnByb3RvdHlwZSxzPSJffnl1aW1+XyIsbz1pLmhhc093blByb3BlcnR5LHU9aS50b1N0cmluZztlLmF1Z21lbnQ9ZnVuY3Rpb24odCxuLHIsaSxzKXt2YXIgYT10LnByb3RvdHlwZSxmPWEmJm4sbD1uLnByb3RvdHlwZSxjPWF8fHQsaCxwLGQsdixtO3JldHVybiBzPXM/ZS5BcnJheShzKTpbXSxmJiYocD17fSxkPXt9LHY9e30saD1mdW5jdGlvbihlLHQpe2lmKHJ8fCEodCBpbiBhKSl1LmNhbGwoZSk9PT0iW29iamVjdCBGdW5jdGlvbl0iPyh2W3RdPWUscFt0XT1kW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIG0odGhpcyxlLGFyZ3VtZW50cyl9KTpwW3RdPWV9LG09ZnVuY3Rpb24oZSx0LHIpe2Zvcih2YXIgaSBpbiB2KW8uY2FsbCh2LGkpJiZlW2ldPT09ZFtpXSYmKGVbaV09dltpXSk7cmV0dXJuIG4uYXBwbHkoZSxzKSx0LmFwcGx5KGUscil9LGk/ZS5BcnJheS5lYWNoKGksZnVuY3Rpb24oZSl7ZSBpbiBsJiZoKGxbZV0sZSl9KTplLk9iamVjdC5lYWNoKGwsaCxudWxsLCEwKSksZS5taXgoYyxwfHxsLHIsaSksZnx8bi5hcHBseShjLHMpLHR9LGUuYWdncmVnYXRlPWZ1bmN0aW9uKHQsbixyLGkpe3JldHVybiBlLm1peCh0LG4scixpLDAsITApfSxlLmV4dGVuZD1mdW5jdGlvbih0LG4scixzKXsoIW58fCF0KSYmZS5lcnJvcigiZXh0ZW5kIGZhaWxlZCwgdmVyaWZ5IGRlcGVuZGVuY2llcyIpO3ZhciBvPW4ucHJvdG90eXBlLHU9ZS5PYmplY3Qobyk7cmV0dXJuIHQucHJvdG90eXBlPXUsdS5jb25zdHJ1Y3Rvcj10LHQuc3VwZXJjbGFzcz1vLG4hPU9iamVjdCYmby5jb25zdHJ1Y3Rvcj09aS5jb25zdHJ1Y3RvciYmKG8uY29uc3RydWN0b3I9biksciYmZS5taXgodSxyLCEwKSxzJiZlLm1peCh0LHMsITApLHR9LGUuZWFjaD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gYShlLHQsbixyLCJlYWNoIil9LGUuc29tZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gYShlLHQsbixyLCJzb21lIil9LGUuY2xvbmU9ZnVuY3Rpb24odCxyLGksbyx1LGEpe3ZhciBmLGwsYztpZighbi5pc09iamVjdCh0KXx8ZS5pbnN0YW5jZU9mKHQsWVVJKXx8dC5hZGRFdmVudExpc3RlbmVyfHx0LmF0dGFjaEV2ZW50KXJldHVybiB0O2w9YXx8e307c3dpdGNoKG4udHlwZSh0KSl7Y2FzZSJkYXRlIjpyZXR1cm4gbmV3IERhdGUodCk7Y2FzZSJyZWdleHAiOnJldHVybiB0O2Nhc2UiZnVuY3Rpb24iOnJldHVybiB0O2Nhc2UiYXJyYXkiOmY9W107YnJlYWs7ZGVmYXVsdDppZih0W3NdKXJldHVybiBsW3Rbc11dO2M9ZS5ndWlkKCksZj1yP3t9OmUuT2JqZWN0KHQpLHRbc109YyxsW2NdPXR9cmV0dXJuIGUuZWFjaCh0LGZ1bmN0aW9uKG4sYSl7KGF8fGE9PT0wKSYmKCFpfHxpLmNhbGwob3x8dGhpcyxuLGEsdGhpcyx0KSE9PSExKSYmYSE9PXMmJmEhPSJwcm90b3R5cGUiJiYodGhpc1thXT1lLmNsb25lKG4scixpLG8sdXx8dCxsKSl9LGYpLGF8fChlLk9iamVjdC5lYWNoKGwsZnVuY3Rpb24oZSx0KXtpZihlW3NdKXRyeXtkZWxldGUgZVtzXX1jYXRjaChuKXtlW3NdPW51bGx9fSx0aGlzKSxsPW51bGwpLGZ9LGUuYmluZD1mdW5jdGlvbih0LHIpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+Mj9lLkFycmF5KGFyZ3VtZW50cywyLCEwKTpudWxsO3JldHVybiBmdW5jdGlvbigpe3ZhciBzPW4uaXNTdHJpbmcodCk/clt0XTp0LG89aT9pLmNvbmNhdChlLkFycmF5KGFyZ3VtZW50cywwLCEwKSk6YXJndW1lbnRzO3JldHVybiBzLmFwcGx5KHJ8fHMsbyl9fSxlLnJiaW5kPWZ1bmN0aW9uKHQscil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yP2UuQXJyYXkoYXJndW1lbnRzLDIsITApOm51bGw7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHM9bi5pc1N0cmluZyh0KT9yW3RdOnQsbz1pP2UuQXJyYXkoYXJndW1lbnRzLDAsITApLmNvbmNhdChpKTphcmd1bWVudHM7cmV0dXJuIHMuYXBwbHkocnx8cyxvKX19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1jdXN0b20tYmFzZSIsZnVuY3Rpb24oZSx0KXtlLkVudi5ldnQ9e2hhbmRsZXM6e30scGx1Z2luczp7fX07dmFyIG49MCxyPTEsaT17b2JqczpudWxsLGJlZm9yZTpmdW5jdGlvbih0LHIsaSxzKXt2YXIgbz10LHU7cmV0dXJuIHMmJih1PVt0LHNdLmNvbmNhdChlLkFycmF5KGFyZ3VtZW50cyw0LCEwKSksbz1lLnJiaW5kLmFwcGx5KGUsdSkpLHRoaXMuX2luamVjdChuLG8scixpKX0sYWZ0ZXI6ZnVuY3Rpb24odCxuLGkscyl7dmFyIG89dCx1O3JldHVybiBzJiYodT1bdCxzXS5jb25jYXQoZS5BcnJheShhcmd1bWVudHMsNCwhMCkpLG89ZS5yYmluZC5hcHBseShlLHUpKSx0aGlzLl9pbmplY3QocixvLG4saSl9LF9pbmplY3Q6ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM9ZS5zdGFtcChyKSxvLHU7cmV0dXJuIHIuX3l1aWFvcHx8KHIuX3l1aWFvcD17fSksbz1yLl95dWlhb3Asb1tpXXx8KG9baV09bmV3IGUuRG8uTWV0aG9kKHIsaSkscltpXT1mdW5jdGlvbigpe3JldHVybiBvW2ldLmV4ZWMuYXBwbHkob1tpXSxhcmd1bWVudHMpfSksdT1zK2Uuc3RhbXAobikraSxvW2ldLnJlZ2lzdGVyKHUsbix0KSxuZXcgZS5FdmVudEhhbmRsZShvW2ldLHUpfSxkZXRhY2g6ZnVuY3Rpb24oZSl7ZS5kZXRhY2gmJmUuZGV0YWNoKCl9fTtlLkRvPWksaS5NZXRob2Q9ZnVuY3Rpb24oZSx0KXt0aGlzLm9iaj1lLHRoaXMubWV0aG9kTmFtZT10LHRoaXMubWV0aG9kPWVbdF0sdGhpcy5iZWZvcmU9e30sdGhpcy5hZnRlcj17fX0saS5NZXRob2QucHJvdG90eXBlLnJlZ2lzdGVyPWZ1bmN0aW9uKGUsdCxuKXtuP3RoaXMuYWZ0ZXJbZV09dDp0aGlzLmJlZm9yZVtlXT10fSxpLk1ldGhvZC5wcm90b3R5cGUuX2RlbGV0ZT1mdW5jdGlvbihlKXtkZWxldGUgdGhpcy5iZWZvcmVbZV0sZGVsZXRlIHRoaXMuYWZ0ZXJbZV19LGkuTWV0aG9kLnByb3RvdHlwZS5leGVjPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5BcnJheShhcmd1bWVudHMsMCwhMCksbixyLHMsbz10aGlzLmJlZm9yZSx1PXRoaXMuYWZ0ZXIsYT0hMTtmb3IobiBpbiBvKWlmKG8uaGFzT3duUHJvcGVydHkobikpe3I9b1tuXS5hcHBseSh0aGlzLm9iaix0KTtpZihyKXN3aXRjaChyLmNvbnN0cnVjdG9yKXtjYXNlIGkuSGFsdDpyZXR1cm4gci5yZXRWYWw7Y2FzZSBpLkFsdGVyQXJnczp0PXIubmV3QXJnczticmVhaztjYXNlIGkuUHJldmVudDphPSEwO2JyZWFrO2RlZmF1bHQ6fX1hfHwocj10aGlzLm1ldGhvZC5hcHBseSh0aGlzLm9iaix0KSksaS5vcmlnaW5hbFJldFZhbD1yLGkuY3VycmVudFJldFZhbD1yO2ZvcihuIGluIHUpaWYodS5oYXNPd25Qcm9wZXJ0eShuKSl7cz11W25dLmFwcGx5KHRoaXMub2JqLHQpO2lmKHMmJnMuY29uc3RydWN0b3I9PT1pLkhhbHQpcmV0dXJuIHMucmV0VmFsO3MmJnMuY29uc3RydWN0b3I9PT1pLkFsdGVyUmV0dXJuJiYocj1zLm5ld1JldFZhbCxpLmN1cnJlbnRSZXRWYWw9cil9cmV0dXJuIHJ9LGkuQWx0ZXJBcmdzPWZ1bmN0aW9uKGUsdCl7dGhpcy5tc2c9ZSx0aGlzLm5ld0FyZ3M9dH0saS5BbHRlclJldHVybj1mdW5jdGlvbihlLHQpe3RoaXMubXNnPWUsdGhpcy5uZXdSZXRWYWw9dH0saS5IYWx0PWZ1bmN0aW9uKGUsdCl7dGhpcy5tc2c9ZSx0aGlzLnJldFZhbD10fSxpLlByZXZlbnQ9ZnVuY3Rpb24oZSl7dGhpcy5tc2c9ZX0saS5FcnJvcj1pLkhhbHQ7dmFyIHM9ZS5BcnJheSxvPSJhZnRlciIsdT1bImJyb2FkY2FzdCIsIm1vbml0b3JlZCIsImJ1YmJsZXMiLCJjb250ZXh0IiwiY29udGV4dEZuIiwiY3VycmVudFRhcmdldCIsImRlZmF1bHRGbiIsImRlZmF1bHRUYXJnZXRPbmx5IiwiZGV0YWlscyIsImVtaXRGYWNhZGUiLCJmaXJlT25jZSIsImFzeW5jIiwiaG9zdCIsInByZXZlbnRhYmxlIiwicHJldmVudGVkRm4iLCJxdWV1YWJsZSIsInNpbGVudCIsInN0b3BwZWRGbiIsInRhcmdldCIsInR5cGUiXSxhPXMuaGFzaCh1KSxmPUFycmF5LnByb3RvdHlwZS5zbGljZSxsPTksYz0ieXVpOmxvZyIsaD1mdW5jdGlvbihlLHQsbil7dmFyIHI7Zm9yKHIgaW4gdClhW3JdJiYobnx8IShyIGluIGUpKSYmKGVbcl09dFtyXSk7cmV0dXJuIGV9O2UuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24odCxuKXt0aGlzLl9rZHM9ZS5DdXN0b21FdmVudC5rZWVwRGVwcmVjYXRlZFN1YnMsdGhpcy5pZD1lLmd1aWQoKSx0aGlzLnR5cGU9dCx0aGlzLnNpbGVudD10aGlzLmxvZ1N5c3RlbT10PT09Yyx0aGlzLl9rZHMmJih0aGlzLnN1YnNjcmliZXJzPXt9LHRoaXMuYWZ0ZXJzPXt9KSxuJiZoKHRoaXMsbiwhMCl9LGUuQ3VzdG9tRXZlbnQua2VlcERlcHJlY2F0ZWRTdWJzPSExLGUuQ3VzdG9tRXZlbnQubWl4Q29uZmlncz1oLGUuQ3VzdG9tRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplLkN1c3RvbUV2ZW50LHNpZ25hdHVyZTpsLGNvbnRleHQ6ZSxwcmV2ZW50YWJsZTohMCxidWJibGVzOiEwLGhhc1N1YnM6ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPTAscj10aGlzLl9zdWJzY3JpYmVycyxpPXRoaXMuX2FmdGVycyxzPXRoaXMuc2libGluZztyZXR1cm4gciYmKHQ9ci5sZW5ndGgpLGkmJihuPWkubGVuZ3RoKSxzJiYocj1zLl9zdWJzY3JpYmVycyxpPXMuX2FmdGVycyxyJiYodCs9ci5sZW5ndGgpLGkmJihuKz1pLmxlbmd0aCkpLGU/ZT09PSJhZnRlciI/bjp0OnQrbn0sbW9uaXRvcjpmdW5jdGlvbihlKXt0aGlzLm1vbml0b3JlZD0hMDt2YXIgdD10aGlzLmlkKyJ8Iit0aGlzLnR5cGUrIl8iK2Usbj1mLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiBuWzBdPXQsdGhpcy5ob3N0Lm9uLmFwcGx5KHRoaXMuaG9zdCxuKX0sZ2V0U3ViczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuc2libGluZyx0PXRoaXMuX3N1YnNjcmliZXJzLG49dGhpcy5fYWZ0ZXJzLHIsaTtyZXR1cm4gZSYmKHI9ZS5fc3Vic2NyaWJlcnMsaT1lLl9hZnRlcnMpLHI/dD90PXQuY29uY2F0KHIpOnQ9ci5jb25jYXQoKTp0P3Q9dC5jb25jYXQoKTp0PVtdLGk/bj9uPW4uY29uY2F0KGkpOm49aS5jb25jYXQoKTpuP249bi5jb25jYXQoKTpuPVtdLFt0LG5dfSxhcHBseUNvbmZpZzpmdW5jdGlvbihlLHQpe2godGhpcyxlLHQpfSxfb246ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHM9bmV3IGUuU3Vic2NyaWJlcih0LG4scixpKSx1O3JldHVybiB0aGlzLmZpcmVPbmNlJiZ0aGlzLmZpcmVkJiYodT10aGlzLmZpcmVkV2l0aCx0aGlzLmVtaXRGYWNhZGUmJnRoaXMuX2FkZEZhY2FkZVRvQXJncyYmdGhpcy5fYWRkRmFjYWRlVG9BcmdzKHUpLHRoaXMuYXN5bmM/c2V0VGltZW91dChlLmJpbmQodGhpcy5fbm90aWZ5LHRoaXMscyx1KSwwKTp0aGlzLl9ub3RpZnkocyx1KSksaT09PW8/KHRoaXMuX2FmdGVyc3x8KHRoaXMuX2FmdGVycz1bXSksdGhpcy5fYWZ0ZXJzLnB1c2gocykpOih0aGlzLl9zdWJzY3JpYmVyc3x8KHRoaXMuX3N1YnNjcmliZXJzPVtdKSx0aGlzLl9zdWJzY3JpYmVycy5wdXNoKHMpKSx0aGlzLl9rZHMmJihpPT09bz90aGlzLmFmdGVyc1tzLmlkXT1zOnRoaXMuc3Vic2NyaWJlcnNbcy5pZF09cyksbmV3IGUuRXZlbnRIYW5kbGUodGhpcyxzKX0sc3Vic2NyaWJlOmZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yP2YuY2FsbChhcmd1bWVudHMsMik6bnVsbDtyZXR1cm4gdGhpcy5fb24oZSx0LG4sITApfSxvbjpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+Mj9mLmNhbGwoYXJndW1lbnRzLDIpOm51bGw7cmV0dXJuIHRoaXMubW9uaXRvcmVkJiZ0aGlzLmhvc3QmJnRoaXMuaG9zdC5fbW9uaXRvcigiYXR0YWNoIix0aGlzLHthcmdzOmFyZ3VtZW50c30pLHRoaXMuX29uKGUsdCxuLCEwKX0sYWZ0ZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjI/Zi5jYWxsKGFyZ3VtZW50cywyKTpudWxsO3JldHVybiB0aGlzLl9vbihlLHQsbixvKX0sZGV0YWNoOmZ1bmN0aW9uKGUsdCl7aWYoZSYmZS5kZXRhY2gpcmV0dXJuIGUuZGV0YWNoKCk7dmFyIG4scixpPTAscz10aGlzLl9zdWJzY3JpYmVycyxvPXRoaXMuX2FmdGVycztpZihzKWZvcihuPXMubGVuZ3RoO24+PTA7bi0tKXI9c1tuXSxyJiYoIWV8fGU9PT1yLmZuKSYmKHRoaXMuX2RlbGV0ZShyLHMsbiksaSsrKTtpZihvKWZvcihuPW8ubGVuZ3RoO24+PTA7bi0tKXI9b1tuXSxyJiYoIWV8fGU9PT1yLmZuKSYmKHRoaXMuX2RlbGV0ZShyLG8sbiksaSsrKTtyZXR1cm4gaX0sdW5zdWJzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2guYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfbm90aWZ5OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gcj1lLm5vdGlmeSh0LHRoaXMpLCExPT09cnx8dGhpcy5zdG9wcGVkPjE/ITE6ITB9LGxvZzpmdW5jdGlvbihlLHQpe30sZmlyZTpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBlLnB1c2guYXBwbHkoZSxhcmd1bWVudHMpLHRoaXMuX2ZpcmUoZSl9LF9maXJlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmZpcmVPbmNlJiZ0aGlzLmZpcmVkPyEwOih0aGlzLmZpcmVkPSEwLHRoaXMuZmlyZU9uY2UmJih0aGlzLmZpcmVkV2l0aD1lKSx0aGlzLmVtaXRGYWNhZGU/dGhpcy5maXJlQ29tcGxleChlKTp0aGlzLmZpcmVTaW1wbGUoZSkpfSxmaXJlU2ltcGxlOmZ1bmN0aW9uKGUpe3RoaXMuc3RvcHBlZD0wLHRoaXMucHJldmVudGVkPTA7aWYodGhpcy5oYXNTdWJzKCkpe3ZhciB0PXRoaXMuZ2V0U3VicygpO3RoaXMuX3Byb2NTdWJzKHRbMF0sZSksdGhpcy5fcHJvY1N1YnModFsxXSxlKX1yZXR1cm4gdGhpcy5icm9hZGNhc3QmJnRoaXMuX2Jyb2FkY2FzdChlKSx0aGlzLnN0b3BwZWQ/ITE6ITB9LGZpcmVDb21wbGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdPWVbMF18fHt9LHRoaXMuZmlyZVNpbXBsZShlKX0sX3Byb2NTdWJzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHM7Zm9yKGk9MCxzPWUubGVuZ3RoO2k8cztpKyspe3I9ZVtpXTtpZihyJiZyLmZuKXshMT09PXRoaXMuX25vdGlmeShyLHQsbikmJih0aGlzLnN0b3BwZWQ9Mik7aWYodGhpcy5zdG9wcGVkPT09MilyZXR1cm4hMX19cmV0dXJuITB9LF9icm9hZGNhc3Q6ZnVuY3Rpb24odCl7aWYoIXRoaXMuc3RvcHBlZCYmdGhpcy5icm9hZGNhc3Qpe3ZhciBuPXQuY29uY2F0KCk7bi51bnNoaWZ0KHRoaXMudHlwZSksdGhpcy5ob3N0IT09ZSYmZS5maXJlLmFwcGx5KGUsbiksdGhpcy5icm9hZGNhc3Q9PT0yJiZlLkdsb2JhbC5maXJlLmFwcGx5KGUuR2xvYmFsLG4pfX0sdW5zdWJzY3JpYmVBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2hBbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxkZXRhY2hBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2goKX0sX2RlbGV0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5fd2hlbjt0fHwodD1yPT09bz90aGlzLl9hZnRlcnM6dGhpcy5fc3Vic2NyaWJlcnMpLHQmJihuPXMuaW5kZXhPZih0LGUsMCksZSYmdFtuXT09PWUmJnQuc3BsaWNlKG4sMSkpLHRoaXMuX2tkcyYmKHI9PT1vP2RlbGV0ZSB0aGlzLmFmdGVyc1tlLmlkXTpkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tlLmlkXSksdGhpcy5tb25pdG9yZWQmJnRoaXMuaG9zdCYmdGhpcy5ob3N0Ll9tb25pdG9yKCJkZXRhY2giLHRoaXMse2NlOnRoaXMsc3ViOmV9KSxlJiYoZS5kZWxldGVkPSEwKX19LGUuU3Vic2NyaWJlcj1mdW5jdGlvbih0LG4scixpKXt0aGlzLmZuPXQsdGhpcy5jb250ZXh0PW4sdGhpcy5pZD1lLmd1aWQoKSx0aGlzLmFyZ3M9cix0aGlzLl93aGVuPWl9LGUuU3Vic2NyaWJlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUuU3Vic2NyaWJlcixfbm90aWZ5OmZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLmRlbGV0ZWQmJiF0aGlzLnBvc3Rwb25lZCl7aWYoIXRoaXMucG9zdHBvbmVkKXJldHVybiBkZWxldGUgdGhpcy5wb3N0cG9uZWQsbnVsbDtkZWxldGUgdGhpcy5mbixkZWxldGUgdGhpcy5jb250ZXh0fXZhciByPXRoaXMuYXJncyxpO3N3aXRjaChuLnNpZ25hdHVyZSl7Y2FzZSAwOmk9dGhpcy5mbi5jYWxsKGUsbi50eXBlLHQsZSk7YnJlYWs7Y2FzZSAxOmk9dGhpcy5mbi5jYWxsKGUsdFswXXx8bnVsbCxlKTticmVhazsKZGVmYXVsdDpyfHx0Pyh0PXR8fFtdLHI9cj90LmNvbmNhdChyKTp0LGk9dGhpcy5mbi5hcHBseShlLHIpKTppPXRoaXMuZm4uY2FsbChlKX1yZXR1cm4gdGhpcy5vbmNlJiZuLl9kZWxldGUodGhpcyksaX0sbm90aWZ5OmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcy5jb250ZXh0LGk9ITA7cnx8KHI9bi5jb250ZXh0Rm4/bi5jb250ZXh0Rm4oKTpuLmNvbnRleHQpO2lmKGUuY29uZmlnJiZlLmNvbmZpZy50aHJvd0ZhaWwpaT10aGlzLl9ub3RpZnkocix0LG4pO2Vsc2UgdHJ5e2k9dGhpcy5fbm90aWZ5KHIsdCxuKX1jYXRjaChzKXtlLmVycm9yKHRoaXMrIiBmYWlsZWQ6ICIrcy5tZXNzYWdlLHMpfXJldHVybiBpfSxjb250YWluczpmdW5jdGlvbihlLHQpe3JldHVybiB0P3RoaXMuZm49PT1lJiZ0aGlzLmNvbnRleHQ9PT10OnRoaXMuZm49PT1lfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9fSxlLkV2ZW50SGFuZGxlPWZ1bmN0aW9uKGUsdCl7dGhpcy5ldnQ9ZSx0aGlzLnN1Yj10fSxlLkV2ZW50SGFuZGxlLnByb3RvdHlwZT17YmF0Y2g6ZnVuY3Rpb24odCxuKXt0LmNhbGwobnx8dGhpcyx0aGlzKSxlLkxhbmcuaXNBcnJheSh0aGlzLmV2dCkmJmUuQXJyYXkuZWFjaCh0aGlzLmV2dCxmdW5jdGlvbihlKXtlLmJhdGNoLmNhbGwobnx8ZSx0KX0pfSxkZXRhY2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmV2dCxuPTAscjtpZih0KWlmKGUuTGFuZy5pc0FycmF5KHQpKWZvcihyPTA7cjx0Lmxlbmd0aDtyKyspbis9dFtyXS5kZXRhY2goKTtlbHNlIHQuX2RlbGV0ZSh0aGlzLnN1Yiksbj0xO3JldHVybiBufSxtb25pdG9yOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmV2dC5tb25pdG9yLmFwcGx5KHRoaXMuZXZ0LGFyZ3VtZW50cyl9fTt2YXIgcD1lLkxhbmcsZD0iOiIsdj0ifCIsbT0ifkFGVEVSfiIsZz0vKC4qPykoOikoLio/KS8seT1lLmNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGcsIiokMiQzIil9KSxiPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIXR8fCFlfHxlLmluZGV4T2YoZCk+LTE/ZTp0K2QrZX0sdz1lLmNhY2hlZChmdW5jdGlvbihlLHQpe3ZhciBuPWUscixpLHM7cmV0dXJuIHAuaXNTdHJpbmcobik/KHM9bi5pbmRleE9mKG0pLHM+LTEmJihpPSEwLG49bi5zdWJzdHIobS5sZW5ndGgpKSxzPW4uaW5kZXhPZih2KSxzPi0xJiYocj1uLnN1YnN0cigwLHMpLG49bi5zdWJzdHIocysxKSxuPT09IioiJiYobj1udWxsKSksW3IsdD9iKG4sdCk6bixpLG5dKTpufSksRT1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl95dWlldnQscjtufHwobj10aGlzLl95dWlldnQ9e2V2ZW50czp7fSx0YXJnZXRzOm51bGwsY29uZmlnOntob3N0OnRoaXMsY29udGV4dDp0aGlzfSxjaGFpbjplLmNvbmZpZy5jaGFpbn0pLHI9bi5jb25maWcsdCYmKGgocix0LCEwKSx0LmNoYWluIT09dW5kZWZpbmVkJiYobi5jaGFpbj10LmNoYWluKSx0LnByZWZpeCYmKHIucHJlZml4PXQucHJlZml4KSl9O0UucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpFLG9uY2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZS5iYXRjaChmdW5jdGlvbihlKXtlLnN1YiYmKGUuc3ViLm9uY2U9ITApfSksZX0sb25jZUFmdGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5hZnRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGUuYmF0Y2goZnVuY3Rpb24oZSl7ZS5zdWImJihlLnN1Yi5vbmNlPSEwKX0pLGV9LHBhcnNlVHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiB3KGUsdHx8dGhpcy5feXVpZXZ0LmNvbmZpZy5wcmVmaXgpfSxvbjpmdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5feXVpZXZ0LHM9dyh0LGkuY29uZmlnLnByZWZpeCksbyx1LGEsbCxjLGgsZCx2PWUuRW52LmV2dC5oYW5kbGVzLGcseSxiLEU9ZS5Ob2RlLFMseCxUO3RoaXMuX21vbml0b3IoImF0dGFjaCIsc1sxXSx7YXJnczphcmd1bWVudHMsY2F0ZWdvcnk6c1swXSxhZnRlcjpzWzJdfSk7aWYocC5pc09iamVjdCh0KSlyZXR1cm4gcC5pc0Z1bmN0aW9uKHQpP2UuRG8uYmVmb3JlLmFwcGx5KGUuRG8sYXJndW1lbnRzKToobz1uLHU9cixhPWYuY2FsbChhcmd1bWVudHMsMCksbD1bXSxwLmlzQXJyYXkodCkmJihUPSEwKSxnPXQuX2FmdGVyLGRlbGV0ZSB0Ll9hZnRlcixlLmVhY2godCxmdW5jdGlvbihlLHQpe3AuaXNPYmplY3QoZSkmJihvPWUuZm58fChwLmlzRnVuY3Rpb24oZSk/ZTpvKSx1PWUuY29udGV4dHx8dSk7dmFyIG49Zz9tOiIiO2FbMF09bisoVD9lOnQpLGFbMV09byxhWzJdPXUsbC5wdXNoKHRoaXMub24uYXBwbHkodGhpcyxhKSl9LHRoaXMpLGkuY2hhaW4/dGhpczpuZXcgZS5FdmVudEhhbmRsZShsKSk7aD1zWzBdLGc9c1syXSxiPXNbM107aWYoRSYmZS5pbnN0YW5jZU9mKHRoaXMsRSkmJmIgaW4gRS5ET01fRVZFTlRTKXJldHVybiBhPWYuY2FsbChhcmd1bWVudHMsMCksYS5zcGxpY2UoMiwwLEUuZ2V0RE9NTm9kZSh0aGlzKSksZS5vbi5hcHBseShlLGEpO3Q9c1sxXTtpZihlLmluc3RhbmNlT2YodGhpcyxZVUkpKXt5PWUuRW52LmV2dC5wbHVnaW5zW3RdLGE9Zi5jYWxsKGFyZ3VtZW50cywwKSxhWzBdPWIsRSYmKFM9YVsyXSxlLmluc3RhbmNlT2YoUyxlLk5vZGVMaXN0KT9TPWUuTm9kZUxpc3QuZ2V0RE9NTm9kZXMoUyk6ZS5pbnN0YW5jZU9mKFMsRSkmJihTPUUuZ2V0RE9NTm9kZShTKSkseD1iIGluIEUuRE9NX0VWRU5UUyx4JiYoYVsyXT1TKSk7aWYoeSlkPXkub24uYXBwbHkoZSxhKTtlbHNlIGlmKCF0fHx4KWQ9ZS5FdmVudC5fYXR0YWNoKGEpfXJldHVybiBkfHwoYz1pLmV2ZW50c1t0XXx8dGhpcy5wdWJsaXNoKHQpLGQ9Yy5fb24obixyLGFyZ3VtZW50cy5sZW5ndGg+Mz9mLmNhbGwoYXJndW1lbnRzLDMpOm51bGwsZz8iYWZ0ZXIiOiEwKSx0LmluZGV4T2YoIio6IikhPT0tMSYmKHRoaXMuX2hhc1NpYmxpbmdzPSEwKSksaCYmKHZbaF09dltoXXx8e30sdltoXVt0XT12W2hdW3RdfHxbXSx2W2hdW3RdLnB1c2goZCkpLGkuY2hhaW4/dGhpczpkfSxzdWJzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGRldGFjaDpmdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5feXVpZXZ0LmV2ZW50cyxzLG89ZS5Ob2RlLHU9byYmZS5pbnN0YW5jZU9mKHRoaXMsbyk7aWYoIXQmJnRoaXMhPT1lKXtmb3IocyBpbiBpKWkuaGFzT3duUHJvcGVydHkocykmJmlbc10uZGV0YWNoKG4scik7cmV0dXJuIHUmJmUuRXZlbnQucHVyZ2VFbGVtZW50KG8uZ2V0RE9NTm9kZSh0aGlzKSksdGhpc312YXIgYT13KHQsdGhpcy5feXVpZXZ0LmNvbmZpZy5wcmVmaXgpLGw9cC5pc0FycmF5KGEpP2FbMF06bnVsbCxjPWE/YVszXTpudWxsLGgsZD1lLkVudi5ldnQuaGFuZGxlcyx2LG0sZyx5LGI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWVbdF0saSxzO2lmKHIpZm9yKHM9ci5sZW5ndGgtMTtzPj0wOy0tcylpPXJbc10uZXZ0LChpLmhvc3Q9PT1ufHxpLmVsPT09bikmJnJbc10uZGV0YWNoKCl9O2lmKGwpe209ZFtsXSx0PWFbMV0sdj11P2UuTm9kZS5nZXRET01Ob2RlKHRoaXMpOnRoaXM7aWYobSl7aWYodCliKG0sdCx2KTtlbHNlIGZvcihzIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShzKSYmYihtLHMsdik7cmV0dXJuIHRoaXN9fWVsc2V7aWYocC5pc09iamVjdCh0KSYmdC5kZXRhY2gpcmV0dXJuIHQuZGV0YWNoKCksdGhpcztpZih1JiYoIWN8fGMgaW4gby5ET01fRVZFTlRTKSlyZXR1cm4gZz1mLmNhbGwoYXJndW1lbnRzLDApLGdbMl09by5nZXRET01Ob2RlKHRoaXMpLGUuZGV0YWNoLmFwcGx5KGUsZyksdGhpc31oPWUuRW52LmV2dC5wbHVnaW5zW2NdO2lmKGUuaW5zdGFuY2VPZih0aGlzLFlVSSkpe2c9Zi5jYWxsKGFyZ3VtZW50cywwKTtpZihoJiZoLmRldGFjaClyZXR1cm4gaC5kZXRhY2guYXBwbHkoZSxnKSx0aGlzO2lmKCF0fHwhaCYmbyYmdCBpbiBvLkRPTV9FVkVOVFMpcmV0dXJuIGdbMF09dCxlLkV2ZW50LmRldGFjaC5hcHBseShlLkV2ZW50LGcpLHRoaXN9cmV0dXJuIHk9aVthWzFdXSx5JiZ5LmRldGFjaChuLHIpLHRoaXN9LHVuc3Vic2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGV0YWNoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZGV0YWNoQWxsOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRldGFjaChlKX0sdW5zdWJzY3JpYmVBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXRhY2hBbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxwdWJsaXNoOmZ1bmN0aW9uKHQsbil7dmFyIHIsaT10aGlzLl95dWlldnQscz1pLmNvbmZpZyxvPXMucHJlZml4O3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/KG8mJih0PWIodCxvKSkscj10aGlzLl9wdWJsaXNoKHQscyxuKSk6KHI9e30sZS5lYWNoKHQsZnVuY3Rpb24oZSx0KXtvJiYodD1iKHQsbykpLHJbdF09dGhpcy5fcHVibGlzaCh0LHMsZXx8bil9LHRoaXMpKSxyfSxfZ2V0RnVsbFR5cGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5feXVpZXZ0LmNvbmZpZy5wcmVmaXg7cmV0dXJuIHQ/dCtkK2U6ZX0sX3B1Ymxpc2g6ZnVuY3Rpb24odCxuLHIpe3ZhciBpLHM9dGhpcy5feXVpZXZ0LG89cy5jb25maWcsdT1vLmhvc3QsYT1vLmNvbnRleHQsZj1zLmV2ZW50cztyZXR1cm4gaT1mW3RdLChvLm1vbml0b3JlZCYmIWl8fGkmJmkubW9uaXRvcmVkKSYmdGhpcy5fbW9uaXRvcigicHVibGlzaCIsdCx7YXJnczphcmd1bWVudHN9KSxpfHwoaT1mW3RdPW5ldyBlLkN1c3RvbUV2ZW50KHQsbiksbnx8KGkuaG9zdD11LGkuY29udGV4dD1hKSksciYmaChpLHIsITApLGl9LF9tb25pdG9yOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHM7aWYodCl7dHlwZW9mIHQ9PSJzdHJpbmciPyhzPXQsaT10aGlzLmdldEV2ZW50KHQsITApKTooaT10LHM9dC50eXBlKTtpZih0aGlzLl95dWlldnQuY29uZmlnLm1vbml0b3JlZCYmKCFpfHxpLm1vbml0b3JlZCl8fGkmJmkubW9uaXRvcmVkKXI9cysiXyIrZSxuLm1vbml0b3JlZD1lLHRoaXMuZmlyZS5jYWxsKHRoaXMscixuKX19LGZpcmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dHlwZW9mIGU9PSJzdHJpbmciLG49YXJndW1lbnRzLmxlbmd0aCxyPWUsaT10aGlzLl95dWlldnQscz1pLmNvbmZpZyxvPXMucHJlZml4LHUsYSxsLGM7dCYmbjw9Mz9uPT09Mj9jPVthcmd1bWVudHNbMV1dOm49PT0zP2M9W2FyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl1dOmM9W106Yz1mLmNhbGwoYXJndW1lbnRzLHQ/MTowKSx0fHwocj1lJiZlLnR5cGUpLG8mJihyPWIocixvKSksYT1pLmV2ZW50c1tyXSx0aGlzLl9oYXNTaWJsaW5ncyYmKGw9dGhpcy5nZXRTaWJsaW5nKHIsYSksbCYmIWEmJihhPXRoaXMucHVibGlzaChyKSkpLChzLm1vbml0b3JlZCYmKCFhfHxhLm1vbml0b3JlZCl8fGEmJmEubW9uaXRvcmVkKSYmdGhpcy5fbW9uaXRvcigiZmlyZSIsYXx8cix7YXJnczpjfSk7aWYoIWEpe2lmKGkuaGFzVGFyZ2V0cylyZXR1cm4gdGhpcy5idWJibGUoe3R5cGU6cn0sYyx0aGlzKTt1PSEwfWVsc2UgbCYmKGEuc2libGluZz1sKSx1PWEuX2ZpcmUoYyk7cmV0dXJuIGkuY2hhaW4/dGhpczp1fSxnZXRTaWJsaW5nOmZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIGUuaW5kZXhPZihkKT4tMSYmKGU9eShlKSxuPXRoaXMuZ2V0RXZlbnQoZSwhMCksbiYmKG4uYXBwbHlDb25maWcodCksbi5idWJibGVzPSExLG4uYnJvYWRjYXN0PTApKSxufSxnZXRFdmVudDpmdW5jdGlvbihlLHQpe3ZhciBuLHI7cmV0dXJuIHR8fChuPXRoaXMuX3l1aWV2dC5jb25maWcucHJlZml4LGU9bj9iKGUsbik6ZSkscj10aGlzLl95dWlldnQuZXZlbnRzLHJbZV18fG51bGx9LGFmdGVyOmZ1bmN0aW9uKHQsbil7dmFyIHI9Zi5jYWxsKGFyZ3VtZW50cywwKTtzd2l0Y2gocC50eXBlKHQpKXtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gZS5Eby5hZnRlci5hcHBseShlLkRvLGFyZ3VtZW50cyk7Y2FzZSJhcnJheSI6Y2FzZSJvYmplY3QiOnJbMF0uX2FmdGVyPSEwO2JyZWFrO2RlZmF1bHQ6clswXT1tK3R9cmV0dXJuIHRoaXMub24uYXBwbHkodGhpcyxyKX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24uYXBwbHkKKHRoaXMsYXJndW1lbnRzKX19LGUuRXZlbnRUYXJnZXQ9RSxlLm1peChlLEUucHJvdG90eXBlKSxFLmNhbGwoZSx7YnViYmxlczohMX0pLFlVSS5FbnYuZ2xvYmFsRXZlbnRzPVlVSS5FbnYuZ2xvYmFsRXZlbnRzfHxuZXcgRSxlLkdsb2JhbD1ZVUkuRW52Lmdsb2JhbEV2ZW50c30sIjMuMTcuMiIse3JlcXVpcmVzOlsib29wIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImRvbS1jb3JlIixmdW5jdGlvbihlLHQpe3ZhciBuPSJub2RlVHlwZSIscj0ib3duZXJEb2N1bWVudCIsaT0iZG9jdW1lbnRFbGVtZW50IixzPSJkZWZhdWx0VmlldyIsbz0icGFyZW50V2luZG93Iix1PSJ0YWdOYW1lIixhPSJwYXJlbnROb2RlIixmPSJwcmV2aW91c1NpYmxpbmciLGw9Im5leHRTaWJsaW5nIixjPSJjb250YWlucyIsaD0iY29tcGFyZURvY3VtZW50UG9zaXRpb24iLHA9W10sZD1mdW5jdGlvbigpe3ZhciB0PWUuY29uZmlnLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKSxuPXQuYXBwZW5kQ2hpbGQoZS5jb25maWcuZG9jLmNyZWF0ZVRleHROb2RlKCIiKSkscj0hMTt0cnl7cj10LmNvbnRhaW5zKG4pfWNhdGNoKGkpe31yZXR1cm4gcn0oKSx2PXtieUlkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYuYWxsQnlJZChlLHQpWzBdfHxudWxsfSxnZXRJZDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gZS5pZCYmIWUuaWQudGFnTmFtZSYmIWUuaWQuaXRlbT90PWUuaWQ6ZS5hdHRyaWJ1dGVzJiZlLmF0dHJpYnV0ZXMuaWQmJih0PWUuYXR0cmlidXRlcy5pZC52YWx1ZSksdH0sc2V0SWQ6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHJpYnV0ZT9lLnNldEF0dHJpYnV0ZSgiaWQiLHQpOmUuaWQ9dH0sYW5jZXN0b3I6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9bnVsbDtyZXR1cm4gbiYmKGk9IXR8fHQoZSk/ZTpudWxsKSxpfHx2LmVsZW1lbnRCeUF4aXMoZSxhLHQsbnVsbCxyKX0sYW5jZXN0b3JzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUscz1bXTt3aGlsZShpPXYuYW5jZXN0b3IoaSx0LG4scikpe249ITE7aWYoaSl7cy51bnNoaWZ0KGkpO2lmKHImJnIoaSkpcmV0dXJuIHN9fXJldHVybiBzfSxlbGVtZW50QnlBeGlzOmZ1bmN0aW9uKGUsdCxuLHIsaSl7d2hpbGUoZSYmKGU9ZVt0XSkpe2lmKChyfHxlW3VdKSYmKCFufHxuKGUpKSlyZXR1cm4gZTtpZihpJiZpKGUpKXJldHVybiBudWxsfXJldHVybiBudWxsfSxjb250YWluczpmdW5jdGlvbihlLHQpe3ZhciByPSExO2lmKCF0fHwhZXx8IXRbbl18fCFlW25dKXI9ITE7ZWxzZSBpZihlW2NdJiYodFtuXT09PTF8fGQpKXI9ZVtjXSh0KTtlbHNlIGlmKGVbaF0pe2lmKGU9PT10fHwhIShlW2hdKHQpJjE2KSlyPSEwfWVsc2Ugcj12Ll9icnV0ZUNvbnRhaW5zKGUsdCk7cmV0dXJuIHJ9LGluRG9jOmZ1bmN0aW9uKGUsdCl7dmFyIG49ITEscztyZXR1cm4gZSYmZS5ub2RlVHlwZSYmKHR8fCh0PWVbcl0pLHM9dFtpXSxzJiZzLmNvbnRhaW5zJiZlLnRhZ05hbWU/bj1zLmNvbnRhaW5zKGUpOm49di5jb250YWlucyhzLGUpKSxufSxhbGxCeUlkOmZ1bmN0aW9uKHQsbil7bj1ufHxlLmNvbmZpZy5kb2M7dmFyIHI9W10saT1bXSxzLG87aWYobi5xdWVyeVNlbGVjdG9yQWxsKWk9bi5xdWVyeVNlbGVjdG9yQWxsKCdbaWQ9IicrdCsnIl0nKTtlbHNlIGlmKG4uYWxsKXtyPW4uYWxsKHQpO2lmKHIpe3Iubm9kZU5hbWUmJihyLmlkPT09dD8oaS5wdXNoKHIpLHI9cCk6cj1bcl0pO2lmKHIubGVuZ3RoKWZvcihzPTA7bz1yW3MrK107KShvLmlkPT09dHx8by5hdHRyaWJ1dGVzJiZvLmF0dHJpYnV0ZXMuaWQmJm8uYXR0cmlidXRlcy5pZC52YWx1ZT09PXQpJiZpLnB1c2gobyl9fWVsc2UgaT1bdi5fZ2V0RG9jKG4pLmdldEVsZW1lbnRCeUlkKHQpXTtyZXR1cm4gaX0saXNXaW5kb3c6ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5zY3JvbGxUbyYmZS5kb2N1bWVudCl9LF9yZW1vdmVDaGlsZE5vZGVzOmZ1bmN0aW9uKGUpe3doaWxlKGUuZmlyc3RDaGlsZCllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCl9LHNpYmxpbmdzOmZ1bmN0aW9uKGUsdCl7dmFyIG49W10scj1lO3doaWxlKHI9cltmXSlyW3VdJiYoIXR8fHQocikpJiZuLnVuc2hpZnQocik7cj1lO3doaWxlKHI9cltsXSlyW3VdJiYoIXR8fHQocikpJiZuLnB1c2gocik7cmV0dXJuIG59LF9icnV0ZUNvbnRhaW5zOmZ1bmN0aW9uKGUsdCl7d2hpbGUodCl7aWYoZT09PXQpcmV0dXJuITA7dD10LnBhcmVudE5vZGV9cmV0dXJuITF9LF9nZXRSZWdFeHA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD10fHwiIix2Ll9yZWdleENhY2hlPXYuX3JlZ2V4Q2FjaGV8fHt9LHYuX3JlZ2V4Q2FjaGVbZSt0XXx8KHYuX3JlZ2V4Q2FjaGVbZSt0XT1uZXcgUmVnRXhwKGUsdCkpLHYuX3JlZ2V4Q2FjaGVbZSt0XX0sX2dldERvYzpmdW5jdGlvbih0KXt2YXIgaT1lLmNvbmZpZy5kb2M7cmV0dXJuIHQmJihpPXRbbl09PT05P3Q6dFtyXXx8dC5kb2N1bWVudHx8ZS5jb25maWcuZG9jKSxpfSxfZ2V0V2luOmZ1bmN0aW9uKHQpe3ZhciBuPXYuX2dldERvYyh0KTtyZXR1cm4gbltzXXx8bltvXXx8ZS5jb25maWcud2lufSxfYmF0Y2g6ZnVuY3Rpb24oZSx0LG4scixpLHMpe3Q9dHlwZW9mIHQ9PSJzdHJpbmciP3ZbdF06dDt2YXIgbyx1PTAsYSxmO2lmKHQmJmUpd2hpbGUoYT1lW3UrK10pbz1vPXQuY2FsbCh2LGEsbixyLGkscyksdHlwZW9mIG8hPSJ1bmRlZmluZWQiJiYoZnx8KGY9W10pLGYucHVzaChvKSk7cmV0dXJuIHR5cGVvZiBmIT0idW5kZWZpbmVkIj9mOmV9LGdlbmVyYXRlSUQ6ZnVuY3Rpb24odCl7dmFyIG49dC5pZDtyZXR1cm4gbnx8KG49ZS5zdGFtcCh0KSx0LmlkPW4pLG59fTtlLkRPTT12fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJvb3AiLCJmZWF0dXJlcyJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkb20tYmFzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbmZpZy5kb2MuZG9jdW1lbnRFbGVtZW50LHI9ZS5ET00saT0idGFnTmFtZSIscz0ib3duZXJEb2N1bWVudCIsbz0iIix1PWUuRmVhdHVyZXMuYWRkLGE9ZS5GZWF0dXJlcy50ZXN0O2UubWl4KHIse2dldFRleHQ6bi50ZXh0Q29udGVudCE9PXVuZGVmaW5lZD9mdW5jdGlvbihlKXt2YXIgdD0iIjtyZXR1cm4gZSYmKHQ9ZS50ZXh0Q29udGVudCksdHx8IiJ9OmZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlJiYodD1lLmlubmVyVGV4dHx8ZS5ub2RlVmFsdWUpLHR8fCIifSxzZXRUZXh0Om4udGV4dENvbnRlbnQhPT11bmRlZmluZWQ/ZnVuY3Rpb24oZSx0KXtlJiYoZS50ZXh0Q29udGVudD10KX06ZnVuY3Rpb24oZSx0KXsiaW5uZXJUZXh0ImluIGU/ZS5pbm5lclRleHQ9dDoibm9kZVZhbHVlImluIGUmJihlLm5vZGVWYWx1ZT10KX0sQ1VTVE9NX0FUVFJJQlVURVM6bi5oYXNBdHRyaWJ1dGU/e2h0bWxGb3I6ImZvciIsY2xhc3NOYW1lOiJjbGFzcyJ9OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn0sc2V0QXR0cmlidXRlOmZ1bmN0aW9uKGUsdCxuLGkpe2UmJnQmJmUuc2V0QXR0cmlidXRlJiYodD1yLkNVU1RPTV9BVFRSSUJVVEVTW3RdfHx0LGUuc2V0QXR0cmlidXRlKHQsbixpKSl9LGdldEF0dHJpYnV0ZTpmdW5jdGlvbihlLHQsbil7bj1uIT09dW5kZWZpbmVkP246Mjt2YXIgaT0iIjtyZXR1cm4gZSYmdCYmZS5nZXRBdHRyaWJ1dGUmJih0PXIuQ1VTVE9NX0FUVFJJQlVURVNbdF18fHQsaT1lLnRhZ05hbWU9PT0iQlVUVE9OIiYmdD09PSJ2YWx1ZSI/ci5nZXRWYWx1ZShlKTplLmdldEF0dHJpYnV0ZSh0LG4pLGk9PT1udWxsJiYoaT0iIikpLGl9LFZBTFVFX1NFVFRFUlM6e30sVkFMVUVfR0VUVEVSUzp7fSxnZXRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0iIixuO3JldHVybiBlJiZlW2ldJiYobj1yLlZBTFVFX0dFVFRFUlNbZVtpXS50b0xvd2VyQ2FzZSgpXSxuP3Q9bihlKTp0PWUudmFsdWUpLHQ9PT1vJiYodD1vKSx0eXBlb2YgdD09InN0cmluZyI/dDoiIn0sc2V0VmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbjtlJiZlW2ldJiYobj1yLlZBTFVFX1NFVFRFUlNbZVtpXS50b0xvd2VyQ2FzZSgpXSx0PXQ9PT1udWxsPyIiOnQsbj9uKGUsdCk6ZS52YWx1ZT10KX0sY3JlYXRvcnM6e319KSx1KCJ2YWx1ZS1zZXQiLCJzZWxlY3QiLHt0ZXN0OmZ1bmN0aW9uKCl7dmFyIHQ9ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpO3JldHVybiB0LmlubmVySFRNTD0iPG9wdGlvbj4xPC9vcHRpb24+PG9wdGlvbj4yPC9vcHRpb24+Iix0LnZhbHVlPSIyIix0LnZhbHVlJiZ0LnZhbHVlPT09IjIifX0pLGEoInZhbHVlLXNldCIsInNlbGVjdCIpfHwoci5WQUxVRV9TRVRURVJTLnNlbGVjdD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLGk9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3B0aW9uIikscztzPWlbbisrXTspaWYoci5nZXRWYWx1ZShzKT09PXQpe3Muc2VsZWN0ZWQ9ITA7YnJlYWt9fSksZS5taXgoci5WQUxVRV9HRVRURVJTLHtidXR0b246ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXR0cmlidXRlcyYmZS5hdHRyaWJ1dGVzLnZhbHVlP2UuYXR0cmlidXRlcy52YWx1ZS52YWx1ZToiIn19KSxlLm1peChyLlZBTFVFX1NFVFRFUlMse2J1dHRvbjpmdW5jdGlvbihlLHQpe3ZhciBuPWUuYXR0cmlidXRlcy52YWx1ZTtufHwobj1lW3NdLmNyZWF0ZUF0dHJpYnV0ZSgidmFsdWUiKSxlLnNldEF0dHJpYnV0ZU5vZGUobikpLG4udmFsdWU9dH19KSxlLm1peChyLlZBTFVFX0dFVFRFUlMse29wdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1lLmF0dHJpYnV0ZXM7cmV0dXJuIHQudmFsdWUmJnQudmFsdWUuc3BlY2lmaWVkP2UudmFsdWU6ZS50ZXh0fSxzZWxlY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS52YWx1ZSxuPWUub3B0aW9ucztyZXR1cm4gbiYmbi5sZW5ndGgmJihlLm11bHRpcGxlfHxlLnNlbGVjdGVkSW5kZXg+LTEmJih0PXIuZ2V0VmFsdWUobltlLnNlbGVjdGVkSW5kZXhdKSkpLHR9fSk7dmFyIGYsbCxjO2UubWl4KGUuRE9NLHtoYXNDbGFzczpmdW5jdGlvbih0LG4pe3ZhciByPWUuRE9NLl9nZXRSZWdFeHAoIig/Ol58XFxzKykiK24rIig/Olxccyt8JCkiKTtyZXR1cm4gci50ZXN0KHQuY2xhc3NOYW1lKX0sYWRkQ2xhc3M6ZnVuY3Rpb24odCxuKXtlLkRPTS5oYXNDbGFzcyh0LG4pfHwodC5jbGFzc05hbWU9ZS5MYW5nLnRyaW0oW3QuY2xhc3NOYW1lLG5dLmpvaW4oIiAiKSkpfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0LG4pe24mJmwodCxuKSYmKHQuY2xhc3NOYW1lPWUuTGFuZy50cmltKHQuY2xhc3NOYW1lLnJlcGxhY2UoZS5ET00uX2dldFJlZ0V4cCgiKD86XnxcXHMrKSIrbisiKD86XFxzK3wkKSIpLCIgIikpLGwodCxuKSYmYyh0LG4pKX0scmVwbGFjZUNsYXNzOmZ1bmN0aW9uKGUsdCxuKXtjKGUsdCksZihlLG4pfSx0b2dnbGVDbGFzczpmdW5jdGlvbihlLHQsbil7dmFyIHI9biE9PXVuZGVmaW5lZD9uOiFsKGUsdCk7cj9mKGUsdCk6YyhlLHQpfX0pLGw9ZS5ET00uaGFzQ2xhc3MsYz1lLkRPTS5yZW1vdmVDbGFzcyxmPWUuRE9NLmFkZENsYXNzO3ZhciBoPS88KFthLXpdKykvaSxyPWUuRE9NLHU9ZS5GZWF0dXJlcy5hZGQsYT1lLkZlYXR1cmVzLnRlc3QscD17fSxkPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGk9ITA7ci5pbm5lckhUTUw9dDtpZighci5maXJzdENoaWxkfHxyLmZpcnN0Q2hpbGQudGFnTmFtZSE9PW4udG9VcHBlckNhc2UoKSlpPSExO3JldHVybiBpfSx2PS8oPzpcLyg/OnRoZWFkfHRmb290fHRib2R5fGNhcHRpb258Y29sfGNvbGdyb3VwKT4pK1xzKjx0Ym9keS8sbT0iPHRhYmxlPiIsZz0iPC90YWJsZT4iLHk7ZS5taXgoZS5ET00se19mcmFnQ2xvbmVzOnt9LF9jcmVhdGU6ZnVuY3Rpb24oZSx0LG4pe249bnx8ImRpdiI7dmFyIGk9ci5fZnJhZ0Nsb25lc1tuXTtyZXR1cm4gaT9pPWkuY2xvbmVOb2RlKCExKTppPXIuX2ZyYWdDbG9uZXNbbl09dC5jcmVhdGVFbGVtZW50KG4pLGkuaW5uZXJIVE1MPWUsaX0sX2NoaWxkcmVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPWUuY2hpbGRyZW4saSxzLG87ciYmci50YWdzJiYodD9yPWUuY2hpbGRyZW4udGFncyh0KTpzPXIudGFncygiISIpLmxlbmd0aCk7aWYoIXJ8fCFyLnRhZ3MmJnR8fHMpe2k9cnx8ZS5jaGlsZE5vZGVzLHI9W107d2hpbGUobz1pW24rK10pby5ub2RlVHlwZT09PTEmJighdHx8dD09PW8udGFnTmFtZSkmJnIucHVzaChvKX1yZXR1cm4gcnx8W119LGNyZWF0ZTpmdW5jdGlvbih0LG4pe3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9ZS5MYW5nLnRyaW0odCkpLG49bnx8ZS5jb25maWcuZG9jO3ZhciBpPWguZXhlYyh0KSxzPXIuX2NyZWF0ZSxvPXAsdT1udWxsLGEsZixsLGM7cmV0dXJuIHQhPXVuZGVmaW5lZCYmKGkmJmlbMV0mJihhPW9baVsxXS50b0xvd2VyQ2FzZSgpXSx0eXBlb2YgYT09ImZ1bmN0aW9uIj9zPWE6Zj1hKSxsPXModCxuLGYpLGM9bC5jaGlsZE5vZGVzLGMubGVuZ3RoPT09MT91PWwucmVtb3ZlQ2hpbGQoY1swXSk6Y1swXSYmY1swXS5jbGFzc05hbWU9PT0ieXVpMy1iaWctZHVtbXkiPyh5PWwuc2VsZWN0ZWRJbmRleCxjLmxlbmd0aD09PTI/dT1jWzBdLm5leHRTaWJsaW5nOihsLnJlbW92ZUNoaWxkKGNbMF0pLHU9ci5fbmwyZnJhZyhjLG4pKSk6dT1yLl9ubDJmcmFnKGMsbikpLHV9LF9ubDJmcmFnOmZ1bmN0aW9uKHQsbil7dmFyIHI9bnVsbCxpLHM7aWYodCYmKHQucHVzaHx8dC5pdGVtKSYmdFswXSl7bj1ufHx0WzBdLm93bmVyRG9jdW1lbnQscj1uLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSx0Lml0ZW0mJih0PWUuQXJyYXkodCwwLCEwKSk7Zm9yKGk9MCxzPXQubGVuZ3RoO2k8cztpKyspci5hcHBlbmRDaGlsZCh0W2ldKX1yZXR1cm4gcn0sYWRkSFRNTDpmdW5jdGlvbih0LG4saSl7dmFyIHM9dC5wYXJlbnROb2RlLG89MCx1LGE9bixmO2lmKG4hPXVuZGVmaW5lZClpZihuLm5vZGVUeXBlKWY9bjtlbHNlIGlmKHR5cGVvZiBuPT0ic3RyaW5nInx8dHlwZW9mIG49PSJudW1iZXIiKWE9Zj1yLmNyZWF0ZShuKTtlbHNlIGlmKG5bMF0mJm5bMF0ubm9kZVR5cGUpe2Y9ZS5jb25maWcuZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTt3aGlsZSh1PW5bbysrXSlmLmFwcGVuZENoaWxkKHUpfWlmKGkpaWYoZiYmaS5wYXJlbnROb2RlKWkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZixpKTtlbHNlIHN3aXRjaChpKXtjYXNlInJlcGxhY2UiOndoaWxlKHQuZmlyc3RDaGlsZCl0LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCk7ZiYmdC5hcHBlbmRDaGlsZChmKTticmVhaztjYXNlImJlZm9yZSI6ZiYmcy5pbnNlcnRCZWZvcmUoZix0KTticmVhaztjYXNlImFmdGVyIjpmJiYodC5uZXh0U2libGluZz9zLmluc2VydEJlZm9yZShmLHQubmV4dFNpYmxpbmcpOnMuYXBwZW5kQ2hpbGQoZikpO2JyZWFrO2RlZmF1bHQ6ZiYmdC5hcHBlbmRDaGlsZChmKX1lbHNlIGYmJnQuYXBwZW5kQ2hpbGQoZik7cmV0dXJuIHQubm9kZU5hbWU9PSJTRUxFQ1QiJiZ5PjAmJih0LnNlbGVjdGVkSW5kZXg9eS0xKSxhfSx3cmFwOmZ1bmN0aW9uKHQsbil7dmFyIHI9biYmbi5ub2RlVHlwZT9uOmUuRE9NLmNyZWF0ZShuKSxpPXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtpLmxlbmd0aCYmKHI9aVtpLmxlbmd0aC0xXSksdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHIsdCksci5hcHBlbmRDaGlsZCh0KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZSxuPXQubGFzdENoaWxkLHI9ZSxpO2lmKHQpe2k9dC5wYXJlbnROb2RlO2lmKGkpe2U9dC5maXJzdENoaWxkO3doaWxlKGUhPT1uKXI9ZS5uZXh0U2libGluZyxpLmluc2VydEJlZm9yZShlLHQpLGU9cjtpLnJlcGxhY2VDaGlsZChuLHQpfWVsc2UgdC5yZW1vdmVDaGlsZChlKX19fSksdSgiaW5uZXJodG1sIiwidGFibGUiLHt0ZXN0OmZ1bmN0aW9uKCl7dmFyIHQ9ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7dHJ5e3QuaW5uZXJIVE1MPSI8dGJvZHk+PC90Ym9keT4ifWNhdGNoKG4pe3JldHVybiExfXJldHVybiB0LmZpcnN0Q2hpbGQmJnQuZmlyc3RDaGlsZC5ub2RlTmFtZT09PSJUQk9EWSJ9fSksdSgiaW5uZXJodG1sLWRpdiIsInRyIix7dGVzdDpmdW5jdGlvbigpe3JldHVybiBkKCI8dHI+PC90cj4iLCJ0ciIpfX0pLHUoImlubmVyaHRtbC1kaXYiLCJzY3JpcHQiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIGQoIjxzY3JpcHQ+PC9zY3JpcHQ+Iiwic2NyaXB0Iil9fSksYSgiaW5uZXJodG1sIiwidGFibGUiKXx8KHAudGJvZHk9ZnVuY3Rpb24odCxuKXt2YXIgaT1yLmNyZWF0ZShtK3QrZyxuKSxzPWUuRE9NLl9jaGlsZHJlbihpLCJ0Ym9keSIpWzBdO3JldHVybiBpLmNoaWxkcmVuLmxlbmd0aD4xJiZzJiYhdi50ZXN0KHQpJiZzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocyksaX0pLGEoImlubmVyaHRtbC1kaXYiLCJzY3JpcHQiKXx8KHAuc2NyaXB0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gbi5pbm5lckhUTUw9Ii0iK2Usbi5yZW1vdmVDaGlsZChuLmZpcnN0Q2hpbGQpLG59LHAubGluaz1wLnN0eWxlPXAuc2NyaXB0KSxhKCJpbm5lcmh0bWwtZGl2IiwidHIiKXx8KGUubWl4KHAse29wdGlvbjpmdW5jdGlvbihlLHQpe3JldHVybiByLmNyZWF0ZSgnPHNlbGVjdD48b3B0aW9uIGNsYXNzPSJ5dWkzLWJpZy1kdW1teSIgc2VsZWN0ZWQ+PC9vcHRpb24+JytlKyI8L3NlbGVjdD4iLHQpfSx0cjpmdW5jdGlvbihlLHQpe3JldHVybiByLmNyZWF0ZSgiPHRib2R5PiIrZSsiPC90Ym9keT4iLHQpfSx0ZDpmdW5jdGlvbihlLHQpe3JldHVybiByLmNyZWF0ZSgiPHRyPiIrZSsiPC90cj4iLHQpfSxjb2w6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5jcmVhdGUoIjxjb2xncm91cD4iK2UrIjwvY29sZ3JvdXA+Iix0KX0sdGJvZHk6InRhYmxlIn0pLGUubWl4KHAse2xlZ2VuZDoiZmllbGRzZXQiCix0aDpwLnRkLHRoZWFkOnAudGJvZHksdGZvb3Q6cC50Ym9keSxjYXB0aW9uOnAudGJvZHksY29sZ3JvdXA6cC50Ym9keSxvcHRncm91cDpwLm9wdGlvbn0pKSxyLmNyZWF0b3JzPXAsZS5taXgoZS5ET00se3NldFdpZHRoOmZ1bmN0aW9uKHQsbil7ZS5ET00uX3NldFNpemUodCwid2lkdGgiLG4pfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCxuKXtlLkRPTS5fc2V0U2l6ZSh0LCJoZWlnaHQiLG4pfSxfc2V0U2l6ZTpmdW5jdGlvbihlLHQsbil7bj1uPjA/bjowO3ZhciByPTA7ZS5zdHlsZVt0XT1uKyJweCIscj10PT09ImhlaWdodCI/ZS5vZmZzZXRIZWlnaHQ6ZS5vZmZzZXRXaWR0aCxyPm4mJihuLT1yLW4sbjwwJiYobj0wKSxlLnN0eWxlW3RdPW4rInB4Iil9fSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1jb3JlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImNvbG9yLWJhc2UiLGZ1bmN0aW9uKGUsdCl7dmFyIG49L14jPyhbXGRhLWZBLUZdezJ9KShbXGRhLWZBLUZdezJ9KShbXGRhLWZBLUZdezJ9KShcdWZmZmUpPy8scj0vXiM/KFtcZGEtZkEtRl17MX0pKFtcZGEtZkEtRl17MX0pKFtcZGEtZkEtRl17MX0pKFx1ZmZmZSk/LyxpPS9yZ2JhP1woKFtcZF17MSwzfSksID8oW1xkXXsxLDN9KSwgPyhbXGRdezEsM30pLD8gPyhbLlxkXSopP1wpLyxzPXtIRVg6ImhleCIsUkdCOiJyZ2IiLFJHQkE6InJnYmEifSxvPXtoZXg6InRvSGV4IixyZ2I6InRvUkdCIixyZ2JhOiJ0b1JHQkEifTtlLkNvbG9yPXtLRVlXT1JEUzp7YmxhY2s6IjAwMCIsc2lsdmVyOiJjMGMwYzAiLGdyYXk6IjgwODA4MCIsd2hpdGU6ImZmZiIsbWFyb29uOiI4MDAwMDAiLHJlZDoiZjAwIixwdXJwbGU6IjgwMDA4MCIsZnVjaHNpYToiZjBmIixncmVlbjoiMDA4MDAwIixsaW1lOiIwZjAiLG9saXZlOiI4MDgwMDAiLHllbGxvdzoiZmYwIixuYXZ5OiIwMDAwODAiLGJsdWU6IjAwZiIsdGVhbDoiMDA4MDgwIixhcXVhOiIwZmYifSxSRUdFWF9IRVg6bixSRUdFWF9IRVgzOnIsUkVHRVhfUkdCOmkscmVfUkdCOmkscmVfaGV4Om4scmVfaGV4MzpyLFNUUl9IRVg6IiN7Kn17Kn17Kn0iLFNUUl9SR0I6InJnYih7Kn0sIHsqfSwgeyp9KSIsU1RSX1JHQkE6InJnYmEoeyp9LCB7Kn0sIHsqfSwgeyp9KSIsVFlQRVM6cyxDT05WRVJUUzpvLGNvbnZlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1lLkNvbG9yLkNPTlZFUlRTW24udG9Mb3dlckNhc2UoKV0saT10O3JldHVybiByJiZlLkNvbG9yW3JdJiYoaT1lLkNvbG9yW3JdKHQpKSxpfSx0b0hleDpmdW5jdGlvbih0KXt2YXIgbj1lLkNvbG9yLl9jb252ZXJ0VG8odCwiaGV4Iikscj1uLnRvTG93ZXJDYXNlKCk9PT0idHJhbnNwYXJlbnQiO3JldHVybiBuLmNoYXJBdCgwKSE9PSIjIiYmIXImJihuPSIjIituKSxyP24udG9Mb3dlckNhc2UoKTpuLnRvVXBwZXJDYXNlKCl9LHRvUkdCOmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IuX2NvbnZlcnRUbyh0LCJyZ2IiKTtyZXR1cm4gbi50b0xvd2VyQ2FzZSgpfSx0b1JHQkE6ZnVuY3Rpb24odCl7dmFyIG49ZS5Db2xvci5fY29udmVydFRvKHQsInJnYmEiKTtyZXR1cm4gbi50b0xvd2VyQ2FzZSgpfSx0b0FycmF5OmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IuZmluZFR5cGUodCkudG9VcHBlckNhc2UoKSxyLGkscyxvO3JldHVybiBuPT09IkhFWCImJnQubGVuZ3RoPDUmJihuPSJIRVgzIiksbi5jaGFyQXQobi5sZW5ndGgtMSk9PT0iQSImJihuPW4uc2xpY2UoMCwtMSkpLHI9ZS5Db2xvclsiUkVHRVhfIituXSxyJiYoaT1yLmV4ZWModCl8fFtdLHM9aS5sZW5ndGgscyYmKGkuc2hpZnQoKSxzLS0sbj09PSJIRVgzIiYmKGlbMF0rPWlbMF0saVsxXSs9aVsxXSxpWzJdKz1pWzJdKSxvPWlbcy0xXSxvfHwoaVtzLTFdPTEpKSksaX0sZnJvbUFycmF5OmZ1bmN0aW9uKHQsbil7dD10LmNvbmNhdCgpO2lmKHR5cGVvZiBuPT0idW5kZWZpbmVkIilyZXR1cm4gdC5qb2luKCIsICIpO3ZhciByPSJ7Kn0iO249ZS5Db2xvclsiU1RSXyIrbi50b1VwcGVyQ2FzZSgpXSx0Lmxlbmd0aD09PTMmJm4ubWF0Y2goL1x7XCpcfS9nKS5sZW5ndGg9PT00JiZ0LnB1c2goMSk7d2hpbGUobi5pbmRleE9mKHIpPj0wJiZ0Lmxlbmd0aD4wKW49bi5yZXBsYWNlKHIsdC5zaGlmdCgpKTtyZXR1cm4gbn0sZmluZFR5cGU6ZnVuY3Rpb24odCl7aWYoZS5Db2xvci5LRVlXT1JEU1t0XSlyZXR1cm4ia2V5d29yZCI7dmFyIG49dC5pbmRleE9mKCIoIikscjtyZXR1cm4gbj4wJiYocj10LnN1YnN0cigwLG4pKSxyJiZlLkNvbG9yLlRZUEVTW3IudG9VcHBlckNhc2UoKV0/ZS5Db2xvci5UWVBFU1tyLnRvVXBwZXJDYXNlKCldOiJoZXgifSxfZ2V0QWxwaGE6ZnVuY3Rpb24odCl7dmFyIG4scj1lLkNvbG9yLnRvQXJyYXkodCk7cmV0dXJuIHIubGVuZ3RoPjMmJihuPXIucG9wKCkpLCtufHwxfSxfa2V5d29yZFRvSGV4OmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IuS0VZV09SRFNbdF07aWYobilyZXR1cm4gbn0sX2NvbnZlcnRUbzpmdW5jdGlvbih0LG4pe2lmKHQ9PT0idHJhbnNwYXJlbnQiKXJldHVybiB0O3ZhciByPWUuQ29sb3IuZmluZFR5cGUodCksaT1uLHMsbyx1LGE7cmV0dXJuIHI9PT0ia2V5d29yZCImJih0PWUuQ29sb3IuX2tleXdvcmRUb0hleCh0KSxyPSJoZXgiKSxyPT09ImhleCImJnQubGVuZ3RoPDUmJih0LmNoYXJBdCgwKT09PSIjIiYmKHQ9dC5zdWJzdHIoMSkpLHQ9IiMiK3QuY2hhckF0KDApK3QuY2hhckF0KDApK3QuY2hhckF0KDEpK3QuY2hhckF0KDEpK3QuY2hhckF0KDIpK3QuY2hhckF0KDIpKSxyPT09bj90OihyLmNoYXJBdChyLmxlbmd0aC0xKT09PSJhIiYmKHI9ci5zbGljZSgwLC0xKSkscz1uLmNoYXJBdChuLmxlbmd0aC0xKT09PSJhIixzJiYobj1uLnNsaWNlKDAsLTEpLG89ZS5Db2xvci5fZ2V0QWxwaGEodCkpLGE9bi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStuLnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpLHU9ZS5Db2xvclsiXyIrcisiVG8iK2FdLHV8fHIhPT0icmdiIiYmbiE9PSJyZ2IiJiYodD1lLkNvbG9yWyJfIityKyJUb1JnYiJdKHQpLHI9InJnYiIsdT1lLkNvbG9yWyJfIityKyJUbyIrYV0pLHUmJih0PXUodCxzKSkscyYmKGUuTGFuZy5pc0FycmF5KHQpfHwodD1lLkNvbG9yLnRvQXJyYXkodCkpLHQucHVzaChvKSx0PWUuQ29sb3IuZnJvbUFycmF5KHQsaS50b1VwcGVyQ2FzZSgpKSksdCl9LF9oZXhUb1JnYjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtyZXR1cm4gZS5jaGFyQXQoMCk9PT0iIyImJihlPWUuc3Vic3RyKDEpKSxlPXBhcnNlSW50KGUsMTYpLG49ZT4+MTYscj1lPj44JjI1NSxpPWUmMjU1LHQ/W24scixpXToicmdiKCIrbisiLCAiK3IrIiwgIitpKyIpIn0sX3JnYlRvSGV4OmZ1bmN0aW9uKHQpe3ZhciBuPWUuQ29sb3IudG9BcnJheSh0KSxyPW5bMl18blsxXTw8OHxuWzBdPDwxNjtyPSgrcikudG9TdHJpbmcoMTYpO3doaWxlKHIubGVuZ3RoPDYpcj0iMCIrcjtyZXR1cm4iIyIrcn19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkb20tc3R5bGUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ImRvY3VtZW50RWxlbWVudCIscj0iZGVmYXVsdFZpZXciLGk9Im93bmVyRG9jdW1lbnQiLHM9InN0eWxlIixvPSJmbG9hdCIsdT0iY3NzRmxvYXQiLGE9InN0eWxlRmxvYXQiLGY9InRyYW5zcGFyZW50IixsPSJnZXRDb21wdXRlZFN0eWxlIixjPSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLGg9ZS5jb25maWcuZG9jLHA9ZS5ET00sZCx2LG09WyJXZWJraXRUcmFuc2Zvcm0iLCJNb3pUcmFuc2Zvcm0iLCJPVHJhbnNmb3JtIiwibXNUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iXSxnPS93aWR0aHxoZWlnaHR8dG9wfGxlZnR8cmlnaHR8Ym90dG9tfG1hcmdpbnxwYWRkaW5nL2k7ZS5BcnJheS5lYWNoKG0sZnVuY3Rpb24oZSl7ZSBpbiBoW25dLnN0eWxlJiYoZD1lLHY9ZSsiT3JpZ2luIil9KSxlLm1peChwLHtERUZBVUxUX1VOSVQ6InB4IixDVVNUT01fU1RZTEVTOnt9LHNldFN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe3I9cnx8ZS5zdHlsZTt2YXIgaT1wLkNVU1RPTV9TVFlMRVM7aWYocil7bj09PW51bGx8fG49PT0iIj9uPSIiOiFpc05hTihOdW1iZXIobikpJiZnLnRlc3QodCkmJihuKz1wLkRFRkFVTFRfVU5JVCk7aWYodCBpbiBpKXtpZihpW3RdLnNldCl7aVt0XS5zZXQoZSxuLHIpO3JldHVybn10eXBlb2YgaVt0XT09InN0cmluZyImJih0PWlbdF0pfWVsc2UgdD09PSIiJiYodD0iY3NzVGV4dCIsbj0iIik7clt0XT1ufX0sZ2V0U3R5bGU6ZnVuY3Rpb24oZSx0LG4pe249bnx8ZS5zdHlsZTt2YXIgcj1wLkNVU1RPTV9TVFlMRVMsaT0iIjtpZihuKXtpZih0IGluIHIpe2lmKHJbdF0uZ2V0KXJldHVybiByW3RdLmdldChlLHQsbik7dHlwZW9mIHJbdF09PSJzdHJpbmciJiYodD1yW3RdKX1pPW5bdF0saT09PSIiJiYoaT1wW2xdKGUsdCkpfXJldHVybiBpfSxzZXRTdHlsZXM6ZnVuY3Rpb24odCxuKXt2YXIgcj10LnN0eWxlO2UuZWFjaChuLGZ1bmN0aW9uKGUsbil7cC5zZXRTdHlsZSh0LG4sZSxyKX0scCl9LGdldENvbXB1dGVkU3R5bGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIixvPWVbaV0sdTtyZXR1cm4gZVtzXSYmb1tyXSYmb1tyXVtsXSYmKHU9b1tyXVtsXShlLG51bGwpLHUmJihuPXVbdF0pKSxufX0pLGhbbl1bc11bdV0hPT11bmRlZmluZWQ/cC5DVVNUT01fU1RZTEVTW29dPXU6aFtuXVtzXVthXSE9PXVuZGVmaW5lZCYmKHAuQ1VTVE9NX1NUWUxFU1tvXT1hKSxlLlVBLndlYmtpdCYmKHBbbF09ZnVuY3Rpb24oZSx0KXt2YXIgbj1lW2ldW3JdLHM9bltsXShlLCIiKVt0XTtyZXR1cm4gcz09PSJyZ2JhKDAsIDAsIDAsIDApIiYmKHM9Ziksc30pLGUuRE9NLl9nZXRBdHRyT2Zmc2V0PWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5ET01bbF0odCxuKSxpPXQub2Zmc2V0UGFyZW50LHMsbyx1O3JldHVybiByPT09ImF1dG8iJiYocz1lLkRPTS5nZXRTdHlsZSh0LCJwb3NpdGlvbiIpLHM9PT0ic3RhdGljInx8cz09PSJyZWxhdGl2ZSI/cj0wOmkmJmlbY10mJihvPWlbY10oKVtuXSx1PXRbY10oKVtuXSxuPT09ImxlZnQifHxuPT09InRvcCI/cj11LW86cj1vLXRbY10oKVtuXSkpLHJ9LGUuRE9NLl9nZXRPZmZzZXQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1udWxsO3JldHVybiBlJiYodD1wLmdldFN0eWxlKGUsInBvc2l0aW9uIiksbj1bcGFyc2VJbnQocFtsXShlLCJsZWZ0IiksMTApLHBhcnNlSW50KHBbbF0oZSwidG9wIiksMTApXSxpc05hTihuWzBdKSYmKG5bMF09cGFyc2VJbnQocC5nZXRTdHlsZShlLCJsZWZ0IiksMTApLGlzTmFOKG5bMF0pJiYoblswXT10PT09InJlbGF0aXZlIj8wOmUub2Zmc2V0TGVmdHx8MCkpLGlzTmFOKG5bMV0pJiYoblsxXT1wYXJzZUludChwLmdldFN0eWxlKGUsInRvcCIpLDEwKSxpc05hTihuWzFdKSYmKG5bMV09dD09PSJyZWxhdGl2ZSI/MDplLm9mZnNldFRvcHx8MCkpKSxufSxkJiYocC5DVVNUT01fU1RZTEVTLnRyYW5zZm9ybT17c2V0OmZ1bmN0aW9uKGUsdCxuKXtuW2RdPXR9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gcFtsXShlLGQpfX0scC5DVVNUT01fU1RZTEVTLnRyYW5zZm9ybU9yaWdpbj17c2V0OmZ1bmN0aW9uKGUsdCxuKXtuW3ZdPXR9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gcFtsXShlLHYpfX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJkb20tYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJzZWxlY3Rvci1uYXRpdmUiLGZ1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKGUpe2UubmFtZXNwYWNlKCJTZWxlY3RvciIpO3ZhciB0PSJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsbj0ib3duZXJEb2N1bWVudCIscj17X3R5cGVzOntlc2M6e3Rva2VuOiJcdWUwMDAiLHJlOi9cXFs6XFtcXVwoXCkjXC5cJ1w+K34iXS9naX0sYXR0cjp7dG9rZW46Ilx1ZTAwMSIscmU6LyhcW1teXF1dKlxdKS9nfSxwc2V1ZG86e3Rva2VuOiJcdWUwMDIiLHJlOi8oXChbXlwpXSpcKSkvZ319LHVzZU5hdGl2ZTohMCxfZXNjYXBlSWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJihlPWUucmVwbGFjZSgvKFs6XFtcXVwoXCkjXC4nPD4rfiJdKS9nLCJcXCQxIikpLGV9LF9jb21wYXJlOiJzb3VyY2VJbmRleCJpbiBlLmNvbmZpZy5kb2MuZG9jdW1lbnRFbGVtZW50P2Z1bmN0aW9uKGUsdCl7dmFyIG49ZS5zb3VyY2VJbmRleCxyPXQuc291cmNlSW5kZXg7cmV0dXJuIG49PT1yPzA6bj5yPzE6LTF9OmUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnRbdF0/ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZVt0XShuKSY0Py0xOjF9OmZ1bmN0aW9uKGUsdCl7dmFyIHIsaSxzO3JldHVybiBlJiZ0JiYocj1lW25dLmNyZWF0ZVJhbmdlKCksci5zZXRTdGFydChlLDApLGk9dFtuXS5jcmVhdGVSYW5nZSgpLGkuc2V0U3RhcnQodCwwKSxzPXIuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKDEsaSkpLHN9LF9zb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYodD1lLkFycmF5KHQsMCwhMCksdC5zb3J0JiZ0LnNvcnQoci5fY29tcGFyZSkpLHR9LF9kZUR1cGU6ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbixyO2ZvcihuPTA7cj1lW24rK107KXIuX2ZvdW5kfHwodFt0Lmxlbmd0aF09cixyLl9mb3VuZD0hMCk7Zm9yKG49MDtyPXRbbisrXTspci5fZm91bmQ9bnVsbCxyLnJlbW92ZUF0dHJpYnV0ZSgiX2ZvdW5kIik7cmV0dXJuIHR9LHF1ZXJ5OmZ1bmN0aW9uKHQsbixpLHMpe249bnx8ZS5jb25maWcuZG9jO3ZhciBvPVtdLHU9ZS5TZWxlY3Rvci51c2VOYXRpdmUmJmUuY29uZmlnLmRvYy5xdWVyeVNlbGVjdG9yJiYhcyxhPVtbdCxuXV0sZixsLGMsaD11P2UuU2VsZWN0b3IuX25hdGl2ZVF1ZXJ5OmUuU2VsZWN0b3IuX2JydXRlUXVlcnk7aWYodCYmaCl7IXMmJighdXx8bi50YWdOYW1lKSYmKGE9ci5fc3BsaXRRdWVyaWVzKHQsbikpO2ZvcihjPTA7Zj1hW2MrK107KWw9aChmWzBdLGZbMV0saSksaXx8KGw9ZS5BcnJheShsLDAsITApKSxsJiYobz1vLmNvbmNhdChsKSk7YS5sZW5ndGg+MSYmKG89ci5fc29ydChyLl9kZUR1cGUobykpKX1yZXR1cm4gaT9vWzBdfHxudWxsOm99LF9yZXBsYWNlU2VsZWN0b3I6ZnVuY3Rpb24odCl7dmFyIG49ZS5TZWxlY3Rvci5fcGFyc2UoImVzYyIsdCksaSxzO3JldHVybiB0PWUuU2VsZWN0b3IuX3JlcGxhY2UoImVzYyIsdCkscz1lLlNlbGVjdG9yLl9wYXJzZSgicHNldWRvIix0KSx0PXIuX3JlcGxhY2UoInBzZXVkbyIsdCksaT1lLlNlbGVjdG9yLl9wYXJzZSgiYXR0ciIsdCksdD1lLlNlbGVjdG9yLl9yZXBsYWNlKCJhdHRyIix0KSx7ZXNjOm4sYXR0cnM6aSxwc2V1ZG9zOnMsc2VsZWN0b3I6dH19LF9yZXN0b3JlU2VsZWN0b3I6ZnVuY3Rpb24odCl7dmFyIG49dC5zZWxlY3RvcjtyZXR1cm4gbj1lLlNlbGVjdG9yLl9yZXN0b3JlKCJhdHRyIixuLHQuYXR0cnMpLG49ZS5TZWxlY3Rvci5fcmVzdG9yZSgicHNldWRvIixuLHQucHNldWRvcyksbj1lLlNlbGVjdG9yLl9yZXN0b3JlKCJlc2MiLG4sdC5lc2MpLG59LF9yZXBsYWNlQ29tbWFzOmZ1bmN0aW9uKHQpe3ZhciBuPWUuU2VsZWN0b3IuX3JlcGxhY2VTZWxlY3Rvcih0KSx0PW4uc2VsZWN0b3I7cmV0dXJuIHQmJih0PXQucmVwbGFjZSgvLC9nLCJcdWUwMDciKSxuLnNlbGVjdG9yPXQsdD1lLlNlbGVjdG9yLl9yZXN0b3JlU2VsZWN0b3IobikpLHR9LF9zcGxpdFF1ZXJpZXM6ZnVuY3Rpb24odCxuKXt0LmluZGV4T2YoIiwiKT4tMSYmKHQ9ZS5TZWxlY3Rvci5fcmVwbGFjZUNvbW1hcyh0KSk7dmFyIHI9dC5zcGxpdCgiXHVlMDA3IiksaT1bXSxzPSIiLG8sdSxhO2lmKG4pe24ubm9kZVR5cGU9PT0xJiYobz1lLlNlbGVjdG9yLl9lc2NhcGVJZChlLkRPTS5nZXRJZChuKSksb3x8KG89ZS5ndWlkKCksZS5ET00uc2V0SWQobixvKSkscz0nW2lkPSInK28rJyJdICcpO2Zvcih1PTAsYT1yLmxlbmd0aDt1PGE7Kyt1KXQ9cytyW3VdLGkucHVzaChbdCxuXSl9cmV0dXJuIGl9LF9uYXRpdmVRdWVyeTpmdW5jdGlvbih0LG4scil7aWYoKGUuVUEud2Via2l0fHxlLlVBLm9wZXJhKSYmdC5pbmRleE9mKCI6Y2hlY2tlZCIpPi0xJiZlLlNlbGVjdG9yLnBzZXVkb3MmJmUuU2VsZWN0b3IucHNldWRvcy5jaGVja2VkKXJldHVybiBlLlNlbGVjdG9yLnF1ZXJ5KHQsbixyLCEwKTt0cnl7cmV0dXJuIG5bInF1ZXJ5U2VsZWN0b3IiKyhyPyIiOiJBbGwiKV0odCl9Y2F0Y2goaSl7cmV0dXJuIGUuU2VsZWN0b3IucXVlcnkodCxuLHIsITApfX0sZmlsdGVyOmZ1bmN0aW9uKHQsbil7dmFyIHI9W10saSxzO2lmKHQmJm4pZm9yKGk9MDtzPXRbaSsrXTspZS5TZWxlY3Rvci50ZXN0KHMsbikmJihyW3IubGVuZ3RoXT1zKTtyZXR1cm4gcn0sdGVzdDpmdW5jdGlvbih0LHIsaSl7dmFyIHM9ITEsbz0hMSx1LGEsZixsLGMsaCxwLGQsdjtpZih0JiZ0LnRhZ05hbWUpaWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpcz1yLmNhbGwodCx0KTtlbHNle3U9ci5zcGxpdCgiLCIpLCFpJiYhZS5ET00uaW5Eb2ModCkmJihhPXQucGFyZW50Tm9kZSxhP2k9YTooYz10W25dLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxjLmFwcGVuZENoaWxkKHQpLGk9YyxvPSEwKSksaT1pfHx0W25dLGg9ZS5TZWxlY3Rvci5fZXNjYXBlSWQoZS5ET00uZ2V0SWQodCkpLGh8fChoPWUuZ3VpZCgpLGUuRE9NLnNldElkKHQsaCkpO2ZvcihwPTA7dj11W3ArK107KXt2Kz0nW2lkPSInK2grJyJdJyxsPWUuU2VsZWN0b3IucXVlcnkodixpKTtmb3IoZD0wO2Y9bFtkKytdOylpZihmPT09dCl7cz0hMDticmVha31pZihzKWJyZWFrfW8mJmMucmVtb3ZlQ2hpbGQodCl9cmV0dXJuIHN9LGFuY2VzdG9yOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gZS5ET00uYW5jZXN0b3IodCxmdW5jdGlvbih0KXtyZXR1cm4gZS5TZWxlY3Rvci50ZXN0KHQsbil9LHIpfSxfcGFyc2U6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5tYXRjaChlLlNlbGVjdG9yLl90eXBlc1t0XS5yZSl9LF9yZXBsYWNlOmZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5TZWxlY3Rvci5fdHlwZXNbdF07cmV0dXJuIG4ucmVwbGFjZShyLnJlLHIudG9rZW4pfSxfcmVzdG9yZTpmdW5jdGlvbih0LG4scil7aWYocil7dmFyIGk9ZS5TZWxlY3Rvci5fdHlwZXNbdF0udG9rZW4scyxvO2ZvcihzPTAsbz1yLmxlbmd0aDtzPG87KytzKW49bi5yZXBsYWNlKGkscltzXSl9cmV0dXJuIG59fTtlLm1peChlLlNlbGVjdG9yLHIsITApfSkoZSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInNlbGVjdG9yIixmdW5jdGlvbihlLHQpe30sIjMuMTcuMiIse3JlcXVpcmVzOlsic2VsZWN0b3ItbmF0aXZlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtY29yZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj0iLiIscj0ibm9kZU5hbWUiLGk9Im5vZGVUeXBlIixzPSJvd25lckRvY3VtZW50IixvPSJ0YWdOYW1lIix1PSJfeXVpZCIsYT17fSxmPUFycmF5LnByb3RvdHlwZS5zbGljZSxsPWUuRE9NLGM9ZnVuY3Rpb24odCl7aWYoIXRoaXMuZ2V0RE9NTm9kZSlyZXR1cm4gbmV3IGModCk7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt0PWMuX2Zyb21TdHJpbmcodCk7aWYoIXQpcmV0dXJuIG51bGx9dmFyIG49dC5ub2RlVHlwZSE9PTk/dC51bmlxdWVJRDp0W3VdO24mJmMuX2luc3RhbmNlc1tuXSYmYy5faW5zdGFuY2VzW25dLl9ub2RlIT09dCYmKHRbdV09bnVsbCksbj1ufHxlLnN0YW1wKHQpLG58fChuPWUuZ3VpZCgpKSx0aGlzW3VdPW4sdGhpcy5fbm9kZT10LHRoaXMuX3N0YXRlUHJveHk9dCx0aGlzLl9pbml0UGx1Z2lucyYmdGhpcy5faW5pdFBsdWdpbnMoKX0saD1mdW5jdGlvbih0KXt2YXIgbj1udWxsO3JldHVybiB0JiYobj10eXBlb2YgdD09InN0cmluZyI/ZnVuY3Rpb24obil7cmV0dXJuIGUuU2VsZWN0b3IudGVzdChuLHQpfTpmdW5jdGlvbihuKXtyZXR1cm4gdChlLm9uZShuKSl9KSxufTtjLkFUVFJTPXt9LGMuRE9NX0VWRU5UUz17fSxjLl9mcm9tU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYodC5pbmRleE9mKCJkb2MiKT09PTA/dD1lLmNvbmZpZy5kb2M6dC5pbmRleE9mKCJ3aW4iKT09PTA/dD1lLmNvbmZpZy53aW46dD1lLlNlbGVjdG9yLnF1ZXJ5KHQsbnVsbCwhMCkpLHR8fG51bGx9LGMuTkFNRT0ibm9kZSIsYy5yZV9hcmlhPS9eKD86cm9sZSR8YXJpYS0pLyxjLlNIT1dfVFJBTlNJVElPTj0iZmFkZUluIixjLkhJREVfVFJBTlNJVElPTj0iZmFkZU91dCIsYy5faW5zdGFuY2VzPXt9LGMuZ2V0RE9NTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZT9lLm5vZGVUeXBlP2U6ZS5fbm9kZXx8bnVsbDpudWxsfSxjLnNjcnViVmFsPWZ1bmN0aW9uKHQsbil7aWYodCl7aWYodHlwZW9mIHQ9PSJvYmplY3QifHx0eXBlb2YgdD09ImZ1bmN0aW9uIilpZihpIGluIHR8fGwuaXNXaW5kb3codCkpdD1lLm9uZSh0KTtlbHNlIGlmKHQuaXRlbSYmIXQuX25vZGVzfHx0WzBdJiZ0WzBdW2ldKXQ9ZS5hbGwodCl9ZWxzZSB0eXBlb2YgdD09InVuZGVmaW5lZCI/dD1uOnQ9PT1udWxsJiYodD1udWxsKTtyZXR1cm4gdH0sYy5hZGRNZXRob2Q9ZnVuY3Rpb24oZSx0LG4pe2UmJnQmJnR5cGVvZiB0PT0iZnVuY3Rpb24iJiYoYy5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgZT1mLmNhbGwoYXJndW1lbnRzKSxyPXRoaXMsaTtyZXR1cm4gZVswXSYmZVswXS5fbm9kZSYmKGVbMF09ZVswXS5fbm9kZSksZVsxXSYmZVsxXS5fbm9kZSYmKGVbMV09ZVsxXS5fbm9kZSksZS51bnNoaWZ0KHIuX25vZGUpLGk9dC5hcHBseShufHxyLGUpLGkmJihpPWMuc2NydWJWYWwoaSxyKSksdHlwZW9mIGkhPSJ1bmRlZmluZWQifHwoaT1yKSxpfSl9LGMuaW1wb3J0TWV0aG9kPWZ1bmN0aW9uKHQsbixyKXt0eXBlb2Ygbj09InN0cmluZyI/KHI9cnx8bixjLmFkZE1ldGhvZChyLHRbbl0sdCkpOmUuQXJyYXkuZWFjaChuLGZ1bmN0aW9uKGUpe2MuaW1wb3J0TWV0aG9kKHQsZSl9KX0sYy5vbmU9ZnVuY3Rpb24odCl7dmFyIG49bnVsbCxyLGk7aWYodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt0PWMuX2Zyb21TdHJpbmcodCk7aWYoIXQpcmV0dXJuIG51bGx9ZWxzZSBpZih0LmdldERPTU5vZGUpcmV0dXJuIHQ7aWYodC5ub2RlVHlwZXx8ZS5ET00uaXNXaW5kb3codCkpe2k9dC51bmlxdWVJRCYmdC5ub2RlVHlwZSE9PTk/dC51bmlxdWVJRDp0Ll95dWlkLG49Yy5faW5zdGFuY2VzW2ldLHI9bj9uLl9ub2RlOm51bGw7aWYoIW58fHImJnQhPT1yKW49bmV3IGModCksdC5ub2RlVHlwZSE9MTEmJihjLl9pbnN0YW5jZXNbblt1XV09bil9fXJldHVybiBufSxjLkRFRkFVTFRfU0VUVEVSPWZ1bmN0aW9uKHQscil7dmFyIGk9dGhpcy5fc3RhdGVQcm94eSxzO3JldHVybiB0LmluZGV4T2Yobik+LTE/KHM9dCx0PXQuc3BsaXQobiksZS5PYmplY3Quc2V0VmFsdWUoaSx0LHIpKTp0eXBlb2YgaVt0XSE9InVuZGVmaW5lZCImJihpW3RdPXIpLHJ9LGMuREVGQVVMVF9HRVRURVI9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5fc3RhdGVQcm94eSxpO3JldHVybiB0LmluZGV4T2YmJnQuaW5kZXhPZihuKT4tMT9pPWUuT2JqZWN0LmdldFZhbHVlKHIsdC5zcGxpdChuKSk6dHlwZW9mIHJbdF0hPSJ1bmRlZmluZWQiJiYoaT1yW3RdKSxpfSxlLm1peChjLnByb3RvdHlwZSx7REFUQV9QUkVGSVg6ImRhdGEtIix0b1N0cmluZzpmdW5jdGlvbigpe3ZhciBlPXRoaXNbdV0rIjogbm90IGJvdW5kIHRvIGEgbm9kZSIsdD10aGlzLl9ub2RlLG4saSxzO3JldHVybiB0JiYobj10LmF0dHJpYnV0ZXMsaT1uJiZuLmlkP3QuZ2V0QXR0cmlidXRlKCJpZCIpOm51bGwscz1uJiZuLmNsYXNzTmFtZT90LmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik6bnVsbCxlPXRbcl0saSYmKGUrPSIjIitpKSxzJiYoZSs9Ii4iK3MucmVwbGFjZSgiICIsIi4iKSksZSs9IiAiK3RoaXNbdV0pLGV9LGdldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpcy5fZ2V0QXR0cj90PXRoaXMuX2dldEF0dHIoZSk6dD10aGlzLl9nZXQoZSksdD90PWMuc2NydWJWYWwodCx0aGlzKTp0PT09bnVsbCYmKHQ9bnVsbCksdH0sX2dldDpmdW5jdGlvbihlKXt2YXIgdD1jLkFUVFJTW2VdLG47cmV0dXJuIHQmJnQuZ2V0dGVyP249dC5nZXR0ZXIuY2FsbCh0aGlzKTpjLnJlX2FyaWEudGVzdChlKT9uPXRoaXMuX25vZGUuZ2V0QXR0cmlidXRlKGUsMik6bj1jLkRFRkFVTFRfR0VUVEVSLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxufSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1jLkFUVFJTW2VdO3JldHVybiB0aGlzLl9zZXRBdHRyP3RoaXMuX3NldEF0dHIuYXBwbHkodGhpcyxhcmd1bWVudHMpOm4mJm4uc2V0dGVyP24uc2V0dGVyLmNhbGwodGhpcyx0LGUpOmMucmVfYXJpYS50ZXN0KGUpP3RoaXMuX25vZGUuc2V0QXR0cmlidXRlKGUsdCk6Yy5ERUZBVUxUX1NFVFRFUi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpc30sc2V0QXR0cnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3NldEF0dHJzP3RoaXMuX3NldEF0dHJzKHQpOmUuT2JqZWN0LmVhY2godCxmdW5jdGlvbihlLHQpe3RoaXMuc2V0KHQsZSl9LHRoaXMpLHRoaXN9LGdldEF0dHJzOmZ1bmN0aW9uKHQpe3ZhciBuPXt9O3JldHVybiB0aGlzLl9nZXRBdHRycz90aGlzLl9nZXRBdHRycyh0KTplLkFycmF5LmVhY2godCxmdW5jdGlvbihlLHQpe25bZV09dGhpcy5nZXQoZSl9LHRoaXMpLG59LGNvbXBhcmVUbzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiBlJiZlLl9ub2RlJiYoZT1lLl9ub2RlKSx0PT09ZX0saW5Eb2M6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZTtpZih0KXtlPWU/ZS5fbm9kZXx8ZTp0W3NdO2lmKGUuZG9jdW1lbnRFbGVtZW50KXJldHVybiBsLmNvbnRhaW5zKGUuZG9jdW1lbnRFbGVtZW50LHQpfXJldHVybiExfSxnZXRCeUlkOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25vZGUscj1sLmJ5SWQodCxuW3NdKTtyZXR1cm4gciYmbC5jb250YWlucyhuLHIpP3I9ZS5vbmUocik6cj1udWxsLHJ9LGFuY2VzdG9yOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTImJih0eXBlb2Ygbj09InN0cmluZyJ8fHR5cGVvZiBuPT0iZnVuY3Rpb24iKSYmKHI9biksZS5vbmUobC5hbmNlc3Rvcih0aGlzLl9ub2RlLGgodCksbixoKHIpKSl9LGFuY2VzdG9yczpmdW5jdGlvbih0LG4scil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0yJiYodHlwZW9mIG49PSJzdHJpbmcifHx0eXBlb2Ygbj09ImZ1bmN0aW9uIikmJihyPW4pLGUuYWxsKGwuYW5jZXN0b3JzKHRoaXMuX25vZGUsaCh0KSxuLGgocikpKX0scHJldmlvdXM6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5vbmUobC5lbGVtZW50QnlBeGlzKHRoaXMuX25vZGUsInByZXZpb3VzU2libGluZyIsaCh0KSxuKSl9LG5leHQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5vbmUobC5lbGVtZW50QnlBeGlzKHRoaXMuX25vZGUsIm5leHRTaWJsaW5nIixoKHQpLG4pKX0sc2libGluZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWxsKGwuc2libGluZ3ModGhpcy5fbm9kZSxoKHQpKSl9LG9uZTpmdW5jdGlvbih0KXtyZXR1cm4gZS5vbmUoZS5TZWxlY3Rvci5xdWVyeSh0LHRoaXMuX25vZGUsITApKX0sYWxsOmZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0aGlzLl9ub2RlJiYobj1lLmFsbChlLlNlbGVjdG9yLnF1ZXJ5KHQsdGhpcy5fbm9kZSkpLG4uX3F1ZXJ5PXQsbi5fcXVlcnlSb290PXRoaXMuX25vZGUpLG58fGUuYWxsKFtdKX0sdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4gZS5TZWxlY3Rvci50ZXN0KHRoaXMuX25vZGUsdCl9LHJlbW92ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSxlJiZ0aGlzLmRlc3Ryb3koKSx0aGlzfSxyZXBsYWNlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX25vZGU7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9Yy5jcmVhdGUoZSkpLHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYy5nZXRET01Ob2RlKGUpLHQpLHRoaXN9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbih0LG4pe3JldHVybiB0eXBlb2YgdD09InN0cmluZyImJih0PWwuY3JlYXRlKHQpKSxlLm9uZSh0aGlzLl9ub2RlLnJlcGxhY2VDaGlsZChjLmdldERPTU5vZGUodCksYy5nZXRET01Ob2RlKG4pKSl9LGRlc3Ryb3k6ZnVuY3Rpb24odCl7dmFyIG49ZS5jb25maWcuZG9jLnVuaXF1ZUlEPyJ1bmlxdWVJRCI6Il95dWlkIixyO3RoaXMucHVyZ2UoKSx0aGlzLnVucGx1ZyYmdGhpcy51bnBsdWcoKSx0aGlzLmNsZWFyRGF0YSgpLHQmJmUuTm9kZUxpc3QuZWFjaCh0aGlzLmFsbCgiKiIpLGZ1bmN0aW9uKHQpe3I9Yy5faW5zdGFuY2VzW3Rbbl1dLHI/ci5kZXN0cm95KCk6ZS5FdmVudC5wdXJnZUVsZW1lbnQodCl9KSx0aGlzLl9ub2RlPW51bGwsdGhpcy5fc3RhdGVQcm94eT1udWxsLGRlbGV0ZSBjLl9pbnN0YW5jZXNbdGhpcy5feXVpZF19LGludm9rZTpmdW5jdGlvbihlLHQsbixyLGkscyl7dmFyIG89dGhpcy5fbm9kZSx1O3JldHVybiB0JiZ0Ll9ub2RlJiYodD10Ll9ub2RlKSxuJiZuLl9ub2RlJiYobj1uLl9ub2RlKSx1PW9bZV0odCxuLHIsaSxzKSxjLnNjcnViVmFsKHUsdGhpcyl9LHN3YXA6ZS5jb25maWcuZG9jLmRvY3VtZW50RWxlbWVudC5zd2FwTm9kZT9mdW5jdGlvbihlKXt0aGlzLl9ub2RlLnN3YXBOb2RlKGMuZ2V0RE9NTm9kZShlKSl9OmZ1bmN0aW9uKGUpe2U9Yy5nZXRET01Ob2RlKGUpO3ZhciB0PXRoaXMuX25vZGUsbj1lLnBhcmVudE5vZGUscj1lLm5leHRTaWJsaW5nO3JldHVybiByPT09dD9uLmluc2VydEJlZm9yZSh0LGUpOmU9PT10Lm5leHRTaWJsaW5nP24uaW5zZXJ0QmVmb3JlKGUsdCk6KHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZSx0KSxsLmFkZEhUTUwobix0LHIpKSx0aGlzfSxoYXNNZXRob2Q6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZTtyZXR1cm4hKCEodCYmZSBpbiB0JiZ0eXBlb2YgdFtlXSE9InVua25vd24iKXx8dHlwZW9mIHRbZV0hPSJmdW5jdGlvbiImJlN0cmluZyh0W2VdKS5pbmRleE9mKCJmdW5jdGlvbiIpIT09MSl9LGlzRnJhZ21lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoIm5vZGVUeXBlIik9PT0xMX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoImNoaWxkTm9kZXMiKS5yZW1vdmUoKS5kZXN0cm95KCEwKSx0aGlzfSxnZXRET01Ob2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGV9fSwhMCksZS5Ob2RlPWMsZS5vbmU9Yy5vbmU7dmFyIHA9ZnVuY3Rpb24odCl7dmFyIG49W107dCYmKHR5cGVvZiB0PT0ic3RyaW5nIj8odGhpcy5fcXVlcnk9dCx0PWUuU2VsZWN0b3IucXVlcnkodCkpOnQubm9kZVR5cGV8fGwuaXNXaW5kb3codCk/dD1bdF06dC5fbm9kZT90PVt0Ll9ub2RlXToKdFswXSYmdFswXS5fbm9kZT8oZS5BcnJheS5lYWNoKHQsZnVuY3Rpb24oZSl7ZS5fbm9kZSYmbi5wdXNoKGUuX25vZGUpfSksdD1uKTp0PWUuQXJyYXkodCwwLCEwKSksdGhpcy5fbm9kZXM9dHx8W119O3AuTkFNRT0iTm9kZUxpc3QiLHAuZ2V0RE9NTm9kZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX25vZGVzP2UuX25vZGVzOmV9LHAuZWFjaD1mdW5jdGlvbih0LG4scil7dmFyIGk9dC5fbm9kZXM7aSYmaS5sZW5ndGgmJmUuQXJyYXkuZWFjaChpLG4scnx8dCl9LHAuYWRkTWV0aG9kPWZ1bmN0aW9uKHQsbixyKXt0JiZuJiYocC5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXt2YXIgdD1bXSxpPWFyZ3VtZW50cztyZXR1cm4gZS5BcnJheS5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKHMpe3ZhciBvPXMudW5pcXVlSUQmJnMubm9kZVR5cGUhPT05PyJ1bmlxdWVJRCI6Il95dWlkIix1PWUuTm9kZS5faW5zdGFuY2VzW3Nbb11dLGEsZjt1fHwodT1wLl9nZXRUZW1wTm9kZShzKSksYT1yfHx1LGY9bi5hcHBseShhLGkpLGYhPT11bmRlZmluZWQmJmYhPT11JiYodFt0Lmxlbmd0aF09Zil9KSx0Lmxlbmd0aD90OnRoaXN9KX0scC5pbXBvcnRNZXRob2Q9ZnVuY3Rpb24odCxuLHIpe3R5cGVvZiBuPT0ic3RyaW5nIj8ocj1yfHxuLHAuYWRkTWV0aG9kKG4sdFtuXSkpOmUuQXJyYXkuZWFjaChuLGZ1bmN0aW9uKGUpe3AuaW1wb3J0TWV0aG9kKHQsZSl9KX0scC5fZ2V0VGVtcE5vZGU9ZnVuY3Rpb24odCl7dmFyIG49cC5fdGVtcE5vZGU7cmV0dXJuIG58fChuPWUuTm9kZS5jcmVhdGUoIjxkaXY+PC9kaXY+IikscC5fdGVtcE5vZGU9biksbi5fbm9kZT10LG4uX3N0YXRlUHJveHk9dCxufSxlLm1peChwLnByb3RvdHlwZSx7X2ludm9rZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9bj9bXTp0aGlzO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSl7dmFyIHM9aVtlXS5hcHBseShpLHQpO24mJnIucHVzaChzKX0pLHJ9LGl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIGUub25lKCh0aGlzLl9ub2Rlc3x8W10pW3RdKX0sZWFjaDpmdW5jdGlvbih0LG4pe3ZhciByPXRoaXM7cmV0dXJuIGUuQXJyYXkuZWFjaCh0aGlzLl9ub2RlcyxmdW5jdGlvbihpLHMpe3JldHVybiBpPWUub25lKGkpLHQuY2FsbChufHxpLGkscyxyKX0pLHJ9LGJhdGNoOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztyZXR1cm4gZS5BcnJheS5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKGkscyl7dmFyIG89ZS5Ob2RlLl9pbnN0YW5jZXNbaVt1XV07cmV0dXJuIG98fChvPXAuX2dldFRlbXBOb2RlKGkpKSx0LmNhbGwobnx8byxvLHMscil9KSxyfSxzb21lOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztyZXR1cm4gZS5BcnJheS5zb21lKHRoaXMuX25vZGVzLGZ1bmN0aW9uKGkscyl7cmV0dXJuIGk9ZS5vbmUoaSksbj1ufHxpLHQuY2FsbChuLGkscyxyKX0pfSx0b0ZyYWc6ZnVuY3Rpb24oKXtyZXR1cm4gZS5vbmUoZS5ET00uX25sMmZyYWcodGhpcy5fbm9kZXMpKX0saW5kZXhPZjpmdW5jdGlvbih0KXtyZXR1cm4gZS5BcnJheS5pbmRleE9mKHRoaXMuX25vZGVzLGUuTm9kZS5nZXRET01Ob2RlKHQpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiBlLmFsbChlLlNlbGVjdG9yLmZpbHRlcih0aGlzLl9ub2Rlcyx0KSl9LG1vZHVsdXM6ZnVuY3Rpb24odCxuKXtuPW58fDA7dmFyIHI9W107cmV0dXJuIHAuZWFjaCh0aGlzLGZ1bmN0aW9uKGUsaSl7aSV0PT09biYmci5wdXNoKGUpfSksZS5hbGwocil9LG9kZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vZHVsdXMoMiwxKX0sZXZlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vZHVsdXMoMil9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxuPXRoaXMuX25vZGVzLHI9dGhpcy5fcXVlcnksaT10aGlzLl9xdWVyeVJvb3Q7cmV0dXJuIHImJihpfHxuJiZuWzBdJiZuWzBdLm93bmVyRG9jdW1lbnQmJihpPW5bMF0ub3duZXJEb2N1bWVudCksdGhpcy5fbm9kZXM9ZS5TZWxlY3Rvci5xdWVyeShyLGkpKSx0aGlzfSxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzLmxlbmd0aH0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2Rlcy5sZW5ndGg8MX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT0iIix0PXRoaXNbdV0rIjogbm90IGJvdW5kIHRvIGFueSBub2RlcyIsbj10aGlzLl9ub2RlcyxpO3JldHVybiBuJiZuWzBdJiYoaT1uWzBdLGUrPWlbcl0saS5pZCYmKGUrPSIjIitpLmlkKSxpLmNsYXNzTmFtZSYmKGUrPSIuIitpLmNsYXNzTmFtZS5yZXBsYWNlKCIgIiwiLiIpKSxuLmxlbmd0aD4xJiYoZSs9Ii4uLlsiK24ubGVuZ3RoKyIgaXRlbXNdIikpLGV8fHR9LGdldERPTU5vZGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzfX0sITApLHAuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJkZXN0cm95IiwiZW1wdHkiLCJyZW1vdmUiLCJzZXQiXSkscC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBuPVtdLHI9dGhpcy5fbm9kZXMsaT0hMSxzPXAuX2dldFRlbXBOb2RlLG8sdTtyZXR1cm4gclswXSYmKG89ZS5Ob2RlLl9pbnN0YW5jZXNbclswXS5feXVpZF18fHMoclswXSksdT1vLl9nZXQodCksdSYmdS5ub2RlVHlwZSYmKGk9ITApKSxlLkFycmF5LmVhY2gocixmdW5jdGlvbihyKXtvPWUuTm9kZS5faW5zdGFuY2VzW3IuX3l1aWRdLG98fChvPXMocikpLHU9by5fZ2V0KHQpLGl8fCh1PWUuTm9kZS5zY3J1YlZhbCh1LG8pKSxuLnB1c2godSl9KSxpP2UuYWxsKG4pOm59LGUuTm9kZUxpc3Q9cCxlLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHAoZSl9LGUuTm9kZS5hbGw9ZS5hbGw7dmFyIGQ9ZS5Ob2RlTGlzdCx2PUFycmF5LnByb3RvdHlwZSxtPXtjb25jYXQ6MSxwb3A6MCxwdXNoOjAsc2hpZnQ6MCxzbGljZToxLHNwbGljZToxLHVuc2hpZnQ6MH07ZS5PYmplY3QuZWFjaChtLGZ1bmN0aW9uKHQsbil7ZC5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXt2YXIgcj1bXSxpPTAscyxvO3doaWxlKHR5cGVvZiAocz1hcmd1bWVudHNbaSsrXSkhPSJ1bmRlZmluZWQiKXIucHVzaChzLl9ub2RlfHxzLl9ub2Rlc3x8cyk7cmV0dXJuIG89dltuXS5hcHBseSh0aGlzLl9ub2RlcyxyKSx0P289ZS5hbGwobyk6bz1lLk5vZGUuc2NydWJWYWwobyksb319KSxlLkFycmF5LmVhY2goWyJyZW1vdmVDaGlsZCIsImhhc0NoaWxkTm9kZXMiLCJjbG9uZU5vZGUiLCJoYXNBdHRyaWJ1dGUiLCJzY3JvbGxJbnRvVmlldyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZm9jdXMiLCJibHVyIiwic3VibWl0IiwicmVzZXQiLCJzZWxlY3QiLCJjcmVhdGVDYXB0aW9uIl0sZnVuY3Rpb24odCl7ZS5Ob2RlLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLG4scil7dmFyIGk9dGhpcy5pbnZva2UodCxlLG4scik7cmV0dXJuIGl9fSksZS5Ob2RlLnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZTtyZXR1cm4gdCYmdC5yZW1vdmVBdHRyaWJ1dGUoZSwwKSx0aGlzfSxlLk5vZGUuaW1wb3J0TWV0aG9kKGUuRE9NLFsiY29udGFpbnMiLCJzZXRBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJ3cmFwIiwidW53cmFwIiwiZ2VuZXJhdGVJRCJdKSxlLk5vZGVMaXN0LmltcG9ydE1ldGhvZChlLk5vZGUucHJvdG90eXBlLFsiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwidW53cmFwIiwid3JhcCIsImdlbmVyYXRlSUQiXSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1jb3JlIiwic2VsZWN0b3IiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgibm9kZS1iYXNlIixmdW5jdGlvbihlLHQpe3ZhciBuPVsiaGFzQ2xhc3MiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwicmVwbGFjZUNsYXNzIiwidG9nZ2xlQ2xhc3MiXTtlLk5vZGUuaW1wb3J0TWV0aG9kKGUuRE9NLG4pLGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsbik7dmFyIHI9ZS5Ob2RlLGk9ZS5ET007ci5jcmVhdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbiYmbi5fbm9kZSYmKG49bi5fbm9kZSksZS5vbmUoaS5jcmVhdGUodCxuKSl9LGUubWl4KHIucHJvdG90eXBlLHtjcmVhdGU6ci5jcmVhdGUsaW5zZXJ0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2luc2VydChlLHQpLHRoaXN9LF9pbnNlcnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9ub2RlLHI9bnVsbDtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiP3Q9dGhpcy5fbm9kZS5jaGlsZE5vZGVzW3RdOnQmJnQuX25vZGUmJih0PXQuX25vZGUpLGUmJnR5cGVvZiBlIT0ic3RyaW5nIiYmKGU9ZS5fbm9kZXx8ZS5fbm9kZXN8fGUpLHI9aS5hZGRIVE1MKG4sZSx0KSxyfSxwcmVwZW5kOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmluc2VydChlLDApfSxhcHBlbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaW5zZXJ0KGUsbnVsbCl9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUpe3JldHVybiByLnNjcnViVmFsKHRoaXMuX2luc2VydChlKSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LG4pe3JldHVybiBlLk5vZGUuc2NydWJWYWwodGhpcy5faW5zZXJ0KHQsbikpfSxhcHBlbmRUbzpmdW5jdGlvbih0KXtyZXR1cm4gZS5vbmUodCkuYXBwZW5kKHRoaXMpLHRoaXN9LHNldENvbnRlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2luc2VydChlLCJyZXBsYWNlIiksdGhpc30sZ2V0Q29udGVudDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIGUuX25vZGUubm9kZVR5cGU9PT0xMSYmKGU9ZS5jcmVhdGUoIjxkaXYvPiIpLmFwcGVuZChlLmNsb25lTm9kZSghMCkpKSxlLmdldCgiaW5uZXJIVE1MIil9fSksZS5Ob2RlLnByb3RvdHlwZS5zZXRIVE1MPWUuTm9kZS5wcm90b3R5cGUuc2V0Q29udGVudCxlLk5vZGUucHJvdG90eXBlLmdldEhUTUw9ZS5Ob2RlLnByb3RvdHlwZS5nZXRDb250ZW50LGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJhcHBlbmQiLCJpbnNlcnQiLCJhcHBlbmRDaGlsZCIsImluc2VydEJlZm9yZSIsInByZXBlbmQiLCJzZXRDb250ZW50IiwiZ2V0Q29udGVudCIsInNldEhUTUwiLCJnZXRIVE1MIl0pO3ZhciByPWUuTm9kZSxpPWUuRE9NO3IuQVRUUlM9e3RleHQ6e2dldHRlcjpmdW5jdGlvbigpe3JldHVybiBpLmdldFRleHQodGhpcy5fbm9kZSl9LHNldHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gaS5zZXRUZXh0KHRoaXMuX25vZGUsZSksZX19LCJmb3IiOntnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXRBdHRyaWJ1dGUodGhpcy5fbm9kZSwiZm9yIil9LHNldHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gaS5zZXRBdHRyaWJ1dGUodGhpcy5fbm9kZSwiZm9yIixlKSxlfX0sb3B0aW9uczp7Z2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9wdGlvbiIpfX0sY2hpbGRyZW46e2dldHRlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX25vZGUsbj10LmNoaWxkcmVuLHIsaSxzO2lmKCFuKXtyPXQuY2hpbGROb2RlcyxuPVtdO2ZvcihpPTAscz1yLmxlbmd0aDtpPHM7KytpKXJbaV0udGFnTmFtZSYmKG5bbi5sZW5ndGhdPXJbaV0pfXJldHVybiBlLmFsbChuKX19LHZhbHVlOntnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXRWYWx1ZSh0aGlzLl9ub2RlKX0sc2V0dGVyOmZ1bmN0aW9uKGUpe3JldHVybiBpLnNldFZhbHVlKHRoaXMuX25vZGUsZSksZX19fSxlLk5vZGUuaW1wb3J0TWV0aG9kKGUuRE9NLFsic2V0QXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIl0pO3ZhciByPWUuTm9kZSxzPWUuTm9kZUxpc3Q7ci5ET01fRVZFTlRTPXthYm9ydDoxLGJlZm9yZXVubG9hZDoxLGJsdXI6MSxjaGFuZ2U6MSxjbGljazoxLGNsb3NlOjEsY29tbWFuZDoxLGNvbnRleHRtZW51OjEsY29weToxLGN1dDoxLGRibGNsaWNrOjEsRE9NTW91c2VTY3JvbGw6MSxkcmFnOjEsZHJhZ3N0YXJ0OjEsZHJhZ2VudGVyOjEsZHJhZ292ZXI6MSxkcmFnbGVhdmU6MSxkcmFnZW5kOjEsZHJvcDoxLGVycm9yOjEsZm9jdXM6MSxrZXk6MSxrZXlkb3duOjEsa2V5cHJlc3M6MSxrZXl1cDoxLGxvYWQ6MSxtZXNzYWdlOjEsbW91c2Vkb3duOjEsbW91c2VlbnRlcjoxLG1vdXNlbGVhdmU6MSxtb3VzZW1vdmU6MSxtb3VzZW11bHRpd2hlZWw6MSxtb3VzZW91dDoxLG1vdXNlb3ZlcjoxLG1vdXNldXA6MSxtb3VzZXdoZWVsOjEsb3JpZW50YXRpb25jaGFuZ2U6MSxwYXN0ZToxLHJlc2V0OjEscmVzaXplOjEsc2VsZWN0OjEsc2VsZWN0c3RhcnQ6MSxzdWJtaXQ6MSxzY3JvbGw6MSx0ZXh0SW5wdXQ6MSx1bmxvYWQ6MSxpbnZhbGlkOjF9LGUubWl4KHIuRE9NX0VWRU5UUyxlLkVudi5ldnQucGx1Z2lucyksZS5hdWdtZW50KHIsZS5FdmVudFRhcmdldCksZS5taXgoci5wcm90b3R5cGUse3B1cmdlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuRXZlbnQucHVyZ2VFbGVtZW50KHRoaXMuX25vZGUsdCxuKSx0aGlzfX0pLGUubWl4KGUuTm9kZUxpc3QucHJvdG90eXBlLHtfcHJlcEV2dEFyZ3M6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUuQXJyYXkoYXJndW1lbnRzLDAsITApO3JldHVybiBpLmxlbmd0aDwyP2lbMl09dGhpcy5fbm9kZXM6aS5zcGxpY2UoMiwwLHRoaXMuX25vZGVzKSxpWzNdPXJ8fHRoaXMsaX0sb246ZnVuY3Rpb24odCxuLHIpe3JldHVybiBlLm9uLmFwcGx5KGUsdGhpcy5fcHJlcEV2dEFyZ3MuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sb25jZTpmdW5jdGlvbih0LG4scil7cmV0dXJuIGUub25jZS5hcHBseShlLHRoaXMuX3ByZXBFdnRBcmdzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGFmdGVyOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gZS5hZnRlci5hcHBseShlLHRoaXMuX3ByZXBFdnRBcmdzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LG9uY2VBZnRlcjpmdW5jdGlvbih0LG4scil7cmV0dXJuIGUub25jZUFmdGVyLmFwcGx5KGUsdGhpcy5fcHJlcEV2dEFyZ3MuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19KSxzLmltcG9ydE1ldGhvZChlLk5vZGUucHJvdG90eXBlLFsiZGV0YWNoIiwiZGV0YWNoQWxsIl0pLGUubWl4KGUuTm9kZS5BVFRSUyx7b2Zmc2V0SGVpZ2h0OntzZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLnNldEhlaWdodCh0aGlzLl9ub2RlLHQpLHR9LGdldHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlLm9mZnNldEhlaWdodH19LG9mZnNldFdpZHRoOntzZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLnNldFdpZHRoKHRoaXMuX25vZGUsdCksdH0sZ2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGUub2Zmc2V0V2lkdGh9fX0pLGUubWl4KGUuTm9kZS5wcm90b3R5cGUse3NpemVUbzpmdW5jdGlvbih0LG4pe3ZhciByO2FyZ3VtZW50cy5sZW5ndGg8MiYmKHI9ZS5vbmUodCksdD1yLmdldCgib2Zmc2V0V2lkdGgiKSxuPXIuZ2V0KCJvZmZzZXRIZWlnaHQiKSksdGhpcy5zZXRBdHRycyh7b2Zmc2V0V2lkdGg6dCxvZmZzZXRIZWlnaHQ6bn0pfX0pLGUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnQuaGFzQXR0cmlidXRlfHwoZS5Ob2RlLnByb3RvdHlwZS5oYXNBdHRyaWJ1dGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0idmFsdWUiJiZ0aGlzLmdldCgidmFsdWUiKSE9PSIiPyEwOiEhdGhpcy5fbm9kZS5hdHRyaWJ1dGVzW2VdJiYhIXRoaXMuX25vZGUuYXR0cmlidXRlc1tlXS5zcGVjaWZpZWR9KSxlLk5vZGUucHJvdG90eXBlLmZvY3VzPWZ1bmN0aW9uKCl7dHJ5e3RoaXMuX25vZGUuZm9jdXMoKX1jYXRjaChlKXt9cmV0dXJuIHRoaXN9LGUuTm9kZS5BVFRSUy50eXBlPXtzZXR0ZXI6ZnVuY3Rpb24oZSl7aWYoZT09PSJoaWRkZW4iKXRyeXt0aGlzLl9ub2RlLnR5cGU9ImhpZGRlbiJ9Y2F0Y2godCl7dGhpcy5fbm9kZS5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLl9pbnB1dFR5cGU9ImhpZGRlbiJ9ZWxzZSB0cnl7dGhpcy5fbm9kZS50eXBlPWV9Y2F0Y2godCl7fXJldHVybiBlfSxnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5wdXRUeXBlfHx0aGlzLl9ub2RlLnR5cGV9LF9ieXBhc3NQcm94eTohMH0sZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbGVtZW50cy5ub2RlVHlwZSYmKGUuTm9kZS5BVFRSUy5lbGVtZW50cz17Z2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWxsKCJpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbiwgc2VsZWN0Iil9fSksZS5taXgoZS5Ob2RlLnByb3RvdHlwZSx7X2luaXREYXRhOmZ1bmN0aW9uKCl7Il9kYXRhImluIHRoaXN8fCh0aGlzLl9kYXRhPXt9KX0sZ2V0RGF0YTpmdW5jdGlvbih0KXt0aGlzLl9pbml0RGF0YSgpO3ZhciBuPXRoaXMuX2RhdGEscj1uO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QgaW4gbj9yPW5bdF06cj10aGlzLl9nZXREYXRhQXR0cmlidXRlKHQpOnR5cGVvZiBuPT0ib2JqZWN0IiYmbiE9PW51bGwmJihyPXt9LGUuT2JqZWN0LmVhY2gobixmdW5jdGlvbihlLHQpe3JbdF09ZX0pLHI9dGhpcy5fZ2V0RGF0YUF0dHJpYnV0ZXMocikpLHJ9LF9nZXREYXRhQXR0cmlidXRlczpmdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PTAsbj10aGlzLl9ub2RlLmF0dHJpYnV0ZXMscj1uLmxlbmd0aCxpPXRoaXMuREFUQV9QUkVGSVgscz1pLmxlbmd0aCxvO3doaWxlKHQ8cilvPW5bdF0ubmFtZSxvLmluZGV4T2YoaSk9PT0wJiYobz1vLnN1YnN0cihzKSxvIGluIGV8fChlW29dPXRoaXMuX2dldERhdGFBdHRyaWJ1dGUobykpKSx0Kz0xO3JldHVybiBlfSxfZ2V0RGF0YUF0dHJpYnV0ZTpmdW5jdGlvbihlKXtlPXRoaXMuREFUQV9QUkVGSVgrZTt2YXIgdD10aGlzLl9ub2RlLG49dC5hdHRyaWJ1dGVzLHI9biYmbltlXSYmbltlXS52YWx1ZTtyZXR1cm4gcn0sc2V0RGF0YTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9pbml0RGF0YSgpLGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLl9kYXRhW2VdPXQ6dGhpcy5fZGF0YT1lLHRoaXN9LGNsZWFyRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4iX2RhdGEiaW4gdGhpcyYmKHR5cGVvZiBlIT0idW5kZWZpbmVkIj9kZWxldGUgdGhpcy5fZGF0YVtlXTpkZWxldGUgdGhpcy5fZGF0YSksdGhpc319KSxlLm1peChlLk5vZGVMaXN0LnByb3RvdHlwZSx7Z2V0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoP1tlXTpbXTtyZXR1cm4gdGhpcy5faW52b2tlKCJnZXREYXRhIix0LCEwKX0sc2V0RGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MT9bZSx0XTpbZV07cmV0dXJuIHRoaXMuX2ludm9rZSgic2V0RGF0YSIsbil9LGNsZWFyRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoP1tlXTpbXTtyZXR1cm4gdGhpcy5faW52b2tlKCJjbGVhckRhdGEiLFtlXSl9fSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImV2ZW50LWJhc2UiLCJub2RlLWNvcmUiLCJkb20tYmFzZSIsImRvbS1zdHlsZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1iYXNlIixmdW5jdGlvbihlLHQpe2UucHVibGlzaCgiZG9tcmVhZHkiLHtmaXJlT25jZTohMCxhc3luYzohMH0pLFlVSS5FbnYuRE9NUmVhZHk/ZS5maXJlKCJkb21yZWFkeSIpOmUuRG8uYmVmb3JlKGZ1bmN0aW9uKCl7ZS5maXJlKCJkb21yZWFkeSIpfSxZVUkuRW52LCJfcmVhZHkiKTt2YXIgbj1lLlVBLHI9e30saT17NjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyNzY6MzMsNjMyNzc6MzQsMjU6OSw2MzI3Mjo0Niw2MzI3MzozNiw2MzI3NTozNX0scz1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gdDt0cnl7dCYmMz09dC5ub2RlVHlwZSYmKHQ9dC5wYXJlbnROb2RlKX1jYXRjaChuKXtyZXR1cm4gbnVsbH1yZXR1cm4gZS5vbmUodCl9LG89ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX2V2ZW50PWUsdGhpcy5fY3VycmVudFRhcmdldD10LHRoaXMuX3dyYXBwZXI9bnx8cix0aGlzLmluaXQoKX07ZS5leHRlbmQobyxPYmplY3Qse2luaXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9ldmVudCx0PXRoaXMuX3dyYXBwZXIub3ZlcnJpZGVzLHI9ZS5wYWdlWCxvPWUucGFnZVksdSxhPXRoaXMuX2N1cnJlbnRUYXJnZXQ7dGhpcy5hbHRLZXk9ZS5hbHRLZXksdGhpcy5jdHJsS2V5PWUuY3RybEtleSx0aGlzLm1ldGFLZXk9ZS5tZXRhS2V5LHRoaXMuc2hpZnRLZXk9ZS5zaGlmdEtleSx0aGlzLnR5cGU9dCYmdC50eXBlfHxlLnR5cGUsdGhpcy5jbGllbnRYPWUuY2xpZW50WCx0aGlzLmNsaWVudFk9ZS5jbGllbnRZLHRoaXMucGFnZVg9cix0aGlzLnBhZ2VZPW8sdT1lLmtleUNvZGV8fGUuY2hhckNvZGUsbi53ZWJraXQmJnUgaW4gaSYmKHU9aVt1XSksdGhpcy5rZXlDb2RlPXUsdGhpcy5jaGFyQ29kZT11LHRoaXMud2hpY2g9ZS53aGljaHx8ZS5jaGFyQ29kZXx8dSx0aGlzLmJ1dHRvbj10aGlzLndoaWNoLHRoaXMudGFyZ2V0PXMoZS50YXJnZXQpLHRoaXMuY3VycmVudFRhcmdldD1zKGEpLHRoaXMucmVsYXRlZFRhcmdldD1zKGUucmVsYXRlZFRhcmdldCk7aWYoZS50eXBlPT0ibW91c2V3aGVlbCJ8fGUudHlwZT09IkRPTU1vdXNlU2Nyb2xsIil0aGlzLndoZWVsRGVsdGE9ZS5kZXRhaWw/ZS5kZXRhaWwqLTE6TWF0aC5yb3VuZChlLndoZWVsRGVsdGEvODApfHwoZS53aGVlbERlbHRhPDA/LTE6MSk7dGhpcy5fdG91Y2gmJnRoaXMuX3RvdWNoKGUsYSx0aGlzLl93cmFwcGVyKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fd3JhcHBlci5zdG9wcGVkPTEsdGhpcy5zdG9wcGVkPTF9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2V2ZW50O2Uuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uP2Uuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk6dGhpcy5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl93cmFwcGVyLnN0b3BwZWQ9Mix0aGlzLnN0b3BwZWQ9Mn0scHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZXZlbnQ7dC5wcmV2ZW50RGVmYXVsdCgpLGUmJih0LnJldHVyblZhbHVlPWUpLHRoaXMuX3dyYXBwZXIucHJldmVudGVkPTEsdGhpcy5wcmV2ZW50ZWQ9MX0saGFsdDpmdW5jdGlvbihlKXtlP3RoaXMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk6dGhpcy5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnByZXZlbnREZWZhdWx0KCl9fSksby5yZXNvbHZlPXMsZS5ET00yRXZlbnRGYWNhZGU9byxlLkRPTUV2ZW50RmFjYWRlPW8sZnVuY3Rpb24oKXtlLkVudi5ldnQuZG9tX3dyYXBwZXJzPXt9LGUuRW52LmV2dC5kb21fbWFwPXt9O3ZhciB0PWUuRW52LmV2dCxuPWUuY29uZmlnLHI9bi53aW4saT1ZVUkuRW52LmFkZCxzPVlVSS5FbnYucmVtb3ZlLG89ZnVuY3Rpb24oKXtZVUkuRW52LndpbmRvd0xvYWRlZD0hMCxlLkV2ZW50Ll9sb2FkKCkscyhyLCJsb2FkIixvKX0sdT1mdW5jdGlvbigpe2UuRXZlbnQuX3VubG9hZCgpfSxhPSJkb21yZWFkeSIsZj0ifnl1aXwyfGNvbXBhdH4iLGw9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0JiZ0eXBlb2YgdCE9InN0cmluZyImJmUuTGFuZy5pc051bWJlcih0Lmxlbmd0aCkmJiF0LnRhZ05hbWUmJiFlLkRPTS5pc1dpbmRvdyh0KX1jYXRjaChuKXtyZXR1cm4hMX19LGM9ZS5DdXN0b21FdmVudC5wcm90b3R5cGUuX2RlbGV0ZSxoPWZ1bmN0aW9uKHQpe3ZhciBuPWMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzLmhhc1N1YnMoKXx8ZS5FdmVudC5fY2xlYW4odGhpcyksbn0scD1mdW5jdGlvbigpe3ZhciBuPSExLG89MCxjPVtdLGQ9dC5kb21fd3JhcHBlcnMsdj1udWxsLG09dC5kb21fbWFwO3JldHVybntQT0xMX1JFVFJZUzoxZTMsUE9MTF9JTlRFUlZBTDo0MCxsYXN0RXJyb3I6bnVsbCxfaW50ZXJ2YWw6bnVsbCxfZHJpOm51bGwsRE9NUmVhZHk6ITEsc3RhcnRJbnRlcnZhbDpmdW5jdGlvbigpe3AuX2ludGVydmFsfHwocC5faW50ZXJ2YWw9c2V0SW50ZXJ2YWwocC5fcG9sbCxwLlBPTExfSU5URVJWQUwpKX0sb25BdmFpbGFibGU6ZnVuY3Rpb24odCxuLHIsaSxzLHUpe3ZhciBhPWUuQXJyYXkodCksZixsO2ZvcihmPTA7ZjxhLmxlbmd0aDtmKz0xKWMucHVzaCh7aWQ6YVtmXSxmbjpuLG9iajpyLG92ZXJyaWRlOmksY2hlY2tSZWFkeTpzLGNvbXBhdDp1fSk7cmV0dXJuIG89dGhpcy5QT0xMX1JFVFJZUyxzZXRUaW1lb3V0KHAuX3BvbGwsMCksbD1uZXcgZS5FdmVudEhhbmRsZSh7X2RlbGV0ZTpmdW5jdGlvbigpe2lmKGwuaGFuZGxlKXtsLmhhbmRsZS5kZXRhY2goKTtyZXR1cm59dmFyIGUsdDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWZvcih0PTA7dDxjLmxlbmd0aDt0KyspYVtlXT09PWNbdF0uaWQmJmMuc3BsaWNlKHQsMSl9fSksbH0sb25Db250ZW50UmVhZHk6ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4gcC5vbkF2YWlsYWJsZShlLHQsbixyLCEwLGkpfSxhdHRhY2g6ZnVuY3Rpb24odCxuLHIsaSl7cmV0dXJuIHAuX2F0dGFjaChlLkFycmF5KGFyZ3VtZW50cywwLCEwKSl9LF9jcmVhdGVXcmFwcGVyOmZ1bmN0aW9uKHQsbixzLG8sdSl7dmFyIGEsZj1lLnN0YW1wKHQpLGw9ImV2ZW50OiIrZituO3JldHVybiExPT09dSYmKGwrPSJuYXRpdmUiKSxzJiYobCs9ImNhcHR1cmUiKSxhPWRbbF0sYXx8KGE9ZS5wdWJsaXNoKGwse3NpbGVudDohMCxidWJibGVzOiExLGVtaXRGYWNhZGU6ITEsY29udGV4dEZuOmZ1bmN0aW9uKCl7cmV0dXJuIG8/YS5lbDooYS5ub2RlUmVmPWEubm9kZVJlZnx8ZS5vbmUoYS5lbCksYS5ub2RlUmVmKX19KSxhLm92ZXJyaWRlcz17fSxhLmVsPXQsYS5rZXk9bCxhLmRvbWtleT1mLGEudHlwZT1uLGEuZm49ZnVuY3Rpb24oZSl7YS5maXJlKHAuZ2V0RXZlbnQoZSx0LG98fCExPT09dSkpfSxhLmNhcHR1cmU9cyx0PT1yJiZuPT0ibG9hZCImJihhLmZpcmVPbmNlPSEwLHY9bCksYS5fZGVsZXRlPWgsZFtsXT1hLG1bZl09bVtmXXx8e30sbVtmXVtsXT1hLGkodCxuLGEuZm4scykpLGF9LF9hdHRhY2g6ZnVuY3Rpb24odCxuKXt2YXIgaSxzLG8sdSxhLGM9ITEsaCxkPXRbMF0sdj10WzFdLG09dFsyXXx8cixnPW4mJm4uZmFjYWRlLHk9biYmbi5jYXB0dXJlLGI9biYmbi5vdmVycmlkZXM7dFt0Lmxlbmd0aC0xXT09PWYmJihpPSEwKTtpZighdnx8IXYuY2FsbClyZXR1cm4hMTtpZihsKG0pKXJldHVybiBzPVtdLGUuZWFjaChtLGZ1bmN0aW9uKGUscil7dFsyXT1lLHMucHVzaChwLl9hdHRhY2godC5zbGljZSgpLG4pKX0pLG5ldyBlLkV2ZW50SGFuZGxlKHMpO2lmKGUuTGFuZy5pc1N0cmluZyhtKSl7aWYoaSlvPWUuRE9NLmJ5SWQobSk7ZWxzZXtvPWUuU2VsZWN0b3IucXVlcnkobSk7c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDA6bz1udWxsO2JyZWFrO2Nhc2UgMTpvPW9bMF07YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdFsyXT1vLHAuX2F0dGFjaCh0LG4pfX1pZighbylyZXR1cm4gaD1wLm9uQXZhaWxhYmxlKG0sZnVuY3Rpb24oKXtoLmhhbmRsZT1wLl9hdHRhY2godCxuKX0scCwhMCwhMSxpKSxoO209b31yZXR1cm4gbT8oZS5Ob2RlJiZlLmluc3RhbmNlT2YobSxlLk5vZGUpJiYobT1lLk5vZGUuZ2V0RE9NTm9kZShtKSksdT1wLl9jcmVhdGVXcmFwcGVyKG0sZCx5LGksZyksYiYmZS5taXgodS5vdmVycmlkZXMsYiksbT09ciYmZD09ImxvYWQiJiZZVUkuRW52LndpbmRvd0xvYWRlZCYmKGM9ITApLGkmJnQucG9wKCksYT10WzNdLGg9dS5fb24odixhLHQubGVuZ3RoPjQ/dC5zbGljZSg0KTpudWxsKSxjJiZ1LmZpcmUoKSxoKTohMX0sZGV0YWNoOmZ1bmN0aW9uKHQsbixyLGkpe3ZhciBzPWUuQXJyYXkoYXJndW1lbnRzLDAsITApLG8sdSxhLGMsaCx2O3Nbcy5sZW5ndGgtMV09PT1mJiYobz0hMCk7aWYodCYmdC5kZXRhY2gpcmV0dXJuIHQuZGV0YWNoKCk7dHlwZW9mIHI9PSJzdHJpbmciJiYobz9yPWUuRE9NLmJ5SWQocik6KHI9ZS5TZWxlY3Rvci5xdWVyeShyKSx1PXIubGVuZ3RoLHU8MT9yPW51bGw6dT09MSYmKHI9clswXSkpKTtpZighcilyZXR1cm4hMTtpZihyLmRldGFjaClyZXR1cm4gcy5zcGxpY2UoMiwxKSxyLmRldGFjaC5hcHBseShyLHMpO2lmKGwocikpe2E9ITA7Zm9yKGM9MCx1PXIubGVuZ3RoO2M8dTsrK2Mpc1syXT1yW2NdLGE9ZS5FdmVudC5kZXRhY2guYXBwbHkoZS5FdmVudCxzKSYmYTtyZXR1cm4gYX1yZXR1cm4hdHx8IW58fCFuLmNhbGw/cC5wdXJnZUVsZW1lbnQociwhMSx0KTooaD0iZXZlbnQ6IitlLnN0YW1wKHIpK3Qsdj1kW2hdLHY/di5kZXRhY2gobik6ITEpfSxnZXRFdmVudDpmdW5jdGlvbih0LG4saSl7dmFyIHM9dHx8ci5ldmVudDtyZXR1cm4gaT9zOm5ldyBlLkRPTUV2ZW50RmFjYWRlKHMsbixkWyJldmVudDoiK2Uuc3RhbXAobikrdC50eXBlXSl9LGdlbmVyYXRlSWQ6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLmdlbmVyYXRlSUQodCl9LF9pc1ZhbGlkQ29sbGVjdGlvbjpsLF9sb2FkOmZ1bmN0aW9uKHQpe258fChuPSEwLGUuZmlyZSYmZS5maXJlKGEpLHAuX3BvbGwoKSl9LF9wb2xsOmZ1bmN0aW9uKCl7aWYocC5sb2NrZWQpcmV0dXJuO2lmKGUuVUEuaWUmJiFZVUkuRW52LkRPTVJlYWR5KXtwLnN0YXJ0SW50ZXJ2YWwoKTtyZXR1cm59cC5sb2NrZWQ9ITA7dmFyIHQscixpLHMsdSxhLGY9IW47Znx8KGY9bz4wKSx1PVtdLGE9ZnVuY3Rpb24odCxuKXt2YXIgcixpPW4ub3ZlcnJpZGU7dHJ5e24uY29tcGF0PyhuLm92ZXJyaWRlP2k9PT0hMD9yPW4ub2JqOnI9aTpyPXQsbi5mbi5jYWxsKHIsbi5vYmopKToocj1uLm9ianx8ZS5vbmUodCksbi5mbi5hcHBseShyLGUuTGFuZy5pc0FycmF5KGkpP2k6W10pKX1jYXRjaChzKXt9fTtmb3IodD0wLHI9Yy5sZW5ndGg7dDxyOysrdClpPWNbdF0saSYmIWkuY2hlY2tSZWFkeSYmKHM9aS5jb21wYXQ/ZS5ET00uYnlJZChpLmlkKTplLlNlbGVjdG9yLnF1ZXJ5KGkuaWQsbnVsbCwhMCkscz8oYShzLGkpLGNbdF09bnVsbCk6dS5wdXNoKGkpKTtmb3IodD0wLHI9Yy5sZW5ndGg7dDxyOysrdCl7aT1jW3RdO2lmKGkmJmkuY2hlY2tSZWFkeSl7cz1pLmNvbXBhdD9lLkRPTS5ieUlkKGkuaWQpOmUuU2VsZWN0b3IucXVlcnkoaS5pZCxudWxsLCEwKTtpZihzKXtpZihufHxzLmdldCYmcy5nZXQoIm5leHRTaWJsaW5nIil8fHMubmV4dFNpYmxpbmcpYShzLGkpLGNbdF09bnVsbH1lbHNlIHUucHVzaChpKX19bz11Lmxlbmd0aD09PTA/MDpvLTEsZj9wLnN0YXJ0SW50ZXJ2YWwoKTooY2xlYXJJbnRlcnZhbChwLl9pbnRlcnZhbCkscC5faW50ZXJ2YWw9bnVsbCkscC5sb2NrZWQ9ITE7cmV0dXJufSxwdXJnZUVsZW1lbnQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUuTGFuZy5pc1N0cmluZyh0KT9lLlNlbGVjdG9yLnF1ZXJ5KHQsbnVsbCwhMCk6dCxzPXAuZ2V0TGlzdGVuZXJzKGksciksbyx1LGEsZjtpZihuJiZpKXtzPXN8fFtdLGE9ZS5TZWxlY3Rvci5xdWVyeSgiKiIsaSksdT1hLmxlbmd0aDtmb3Iobz0wO288dTsrK28pZj1wLmdldExpc3RlbmVycyhhW29dLHIpLGYmJihzPXMuY29uY2F0KGYpKX1pZihzKWZvcihvPTAsdT1zLmxlbmd0aDtvPHU7KytvKXNbb10uZGV0YWNoQWxsKCl9CixfY2xlYW46ZnVuY3Rpb24odCl7dmFyIG49dC5rZXkscj10LmRvbWtleTtzKHQuZWwsdC50eXBlLHQuZm4sdC5jYXB0dXJlKSxkZWxldGUgZFtuXSxkZWxldGUgZS5feXVpZXZ0LmV2ZW50c1tuXSxtW3JdJiYoZGVsZXRlIG1bcl1bbl0sZS5PYmplY3Quc2l6ZShtW3JdKXx8ZGVsZXRlIG1bcl0pfSxnZXRMaXN0ZW5lcnM6ZnVuY3Rpb24obixyKXt2YXIgaT1lLnN0YW1wKG4sITApLHM9bVtpXSxvPVtdLHU9cj8iZXZlbnQ6IitpK3I6bnVsbCxhPXQucGx1Z2lucztyZXR1cm4gcz8odT8oYVtyXSYmYVtyXS5ldmVudERlZiYmKHUrPSJfc3ludGgiKSxzW3VdJiZvLnB1c2goc1t1XSksdSs9Im5hdGl2ZSIsc1t1XSYmby5wdXNoKHNbdV0pKTplLmVhY2gocyxmdW5jdGlvbihlLHQpe28ucHVzaChlKX0pLG8ubGVuZ3RoP286bnVsbCk6bnVsbH0sX3VubG9hZDpmdW5jdGlvbih0KXtlLmVhY2goZCxmdW5jdGlvbihlLG4pe2UudHlwZT09InVubG9hZCImJmUuZmlyZSh0KSxlLmRldGFjaEFsbCgpfSkscyhyLCJ1bmxvYWQiLHUpfSxuYXRpdmVBZGQ6aSxuYXRpdmVSZW1vdmU6c319KCk7ZS5FdmVudD1wLG4uaW5qZWN0ZWR8fFlVSS5FbnYud2luZG93TG9hZGVkP28oKTppKHIsImxvYWQiLG8pO2lmKGUuVUEuaWUpe2Uub24oYSxwLl9wb2xsKTtpZihlLlVBLmllPDcpdHJ5e2kociwidW5sb2FkIix1KX1jYXRjaChkKXt9fXAuQ3VzdG9tPWUuQ3VzdG9tRXZlbnQscC5TdWJzY3JpYmVyPWUuU3Vic2NyaWJlcixwLlRhcmdldD1lLkV2ZW50VGFyZ2V0LHAuSGFuZGxlPWUuRXZlbnRIYW5kbGUscC5GYWNhZGU9ZS5FdmVudEZhY2FkZSxwLl9wb2xsKCl9KCksZS5FbnYuZXZ0LnBsdWdpbnMuYXZhaWxhYmxlPXtvbjpmdW5jdGlvbih0LG4scixpKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjQ/ZS5BcnJheShhcmd1bWVudHMsNCwhMCk6bnVsbDtyZXR1cm4gZS5FdmVudC5vbkF2YWlsYWJsZS5jYWxsKGUuRXZlbnQscixuLGkscyl9fSxlLkVudi5ldnQucGx1Z2lucy5jb250ZW50cmVhZHk9e29uOmZ1bmN0aW9uKHQsbixyLGkpe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGg+ND9lLkFycmF5KGFyZ3VtZW50cyw0LCEwKTpudWxsO3JldHVybiBlLkV2ZW50Lm9uQ29udGVudFJlYWR5LmNhbGwoZS5FdmVudCxyLG4saSxzKX19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgooZnVuY3Rpb24oKXt2YXIgZSx0PVlVSS5FbnYsbj1ZVUkuY29uZmlnLHI9bi5kb2MsaT1yJiZyLmRvY3VtZW50RWxlbWVudCxzPSJvbnJlYWR5c3RhdGVjaGFuZ2UiLG89bi5wb2xsSW50ZXJ2YWx8fDQwO2kuZG9TY3JvbGwmJiF0Ll9pZXJlYWR5JiYodC5faWVyZWFkeT1mdW5jdGlvbigpe3QuX3JlYWR5KCl9LAovKiEgRE9NUmVhZHk6IGJhc2VkIG9uIHdvcmsgYnk6IERlYW4gRWR3YXJkcy9Kb2huIFJlc2lnL01hdHRoaWFzIE1pbGxlci9EaWVnbyBQZXJpbmkgKi8Kc2VsZiE9PXNlbGYudG9wPyhlPWZ1bmN0aW9uKCl7ci5yZWFkeVN0YXRlPT0iY29tcGxldGUiJiYodC5yZW1vdmUocixzLGUpLHQuaWVyZWFkeSgpKX0sdC5hZGQocixzLGUpKTp0Ll9kcmk9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0cnl7aS5kb1Njcm9sbCgibGVmdCIpLGNsZWFySW50ZXJ2YWwodC5fZHJpKSx0Ll9kcmk9bnVsbCx0Ll9pZXJlYWR5KCl9Y2F0Y2goZSl7fX0sbykpfSkoKSxZVUkuYWRkKCJldmVudC1iYXNlLWllIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtlLkRPTTJFdmVudEZhY2FkZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcih0KXt2YXIgbj1lLmNvbmZpZy5kb2MuY3JlYXRlRXZlbnRPYmplY3QodCksaT1yLnByb3RvdHlwZTtyZXR1cm4gbi5oYXNPd25Qcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiEwfSxuLmluaXQ9aS5pbml0LG4uaGFsdD1pLmhhbHQsbi5wcmV2ZW50RGVmYXVsdD1pLnByZXZlbnREZWZhdWx0LG4uc3RvcFByb3BhZ2F0aW9uPWkuc3RvcFByb3BhZ2F0aW9uLG4uc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uPWkuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uLGUuRE9NMkV2ZW50RmFjYWRlLmFwcGx5KG4sYXJndW1lbnRzKSxufXZhciBpPWUuY29uZmlnLmRvYyYmZS5jb25maWcuZG9jLmltcGxlbWVudGF0aW9uLHM9ZS5jb25maWcubGF6eUV2ZW50RmFjYWRlLG89ezA6MSw0OjIsMjozfSx1PXttb3VzZW91dDoidG9FbGVtZW50Iixtb3VzZW92ZXI6ImZyb21FbGVtZW50In0sYT1lLkRPTTJFdmVudEZhY2FkZS5yZXNvbHZlLGY9e2luaXQ6ZnVuY3Rpb24oKXtuLnN1cGVyY2xhc3MuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHQ9dGhpcy5fZXZlbnQscixpLHMsdSxmLGw7dGhpcy50YXJnZXQ9YSh0LnNyY0VsZW1lbnQpLCJjbGllbnRYImluIHQmJiFyJiYwIT09ciYmKHI9dC5jbGllbnRYLGk9dC5jbGllbnRZLHM9ZS5jb25maWcuZG9jLHU9cy5ib2R5LGY9cy5kb2N1bWVudEVsZW1lbnQscis9Zi5zY3JvbGxMZWZ0fHx1JiZ1LnNjcm9sbExlZnR8fDAsaSs9Zi5zY3JvbGxUb3B8fHUmJnUuc2Nyb2xsVG9wfHwwLHRoaXMucGFnZVg9cix0aGlzLnBhZ2VZPWkpLHQudHlwZT09Im1vdXNlb3V0Ij9sPXQudG9FbGVtZW50OnQudHlwZT09Im1vdXNlb3ZlciImJihsPXQuZnJvbUVsZW1lbnQpLHRoaXMucmVsYXRlZFRhcmdldD1hKGx8fHQucmVsYXRlZFRhcmdldCksdGhpcy53aGljaD10aGlzLmJ1dHRvbj10LmtleUNvZGV8fG9bdC5idXR0b25dfHx0LmJ1dHRvbn0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQuY2FuY2VsQnViYmxlPSEwLHRoaXMuX3dyYXBwZXIuc3RvcHBlZD0xLHRoaXMuc3RvcHBlZD0xfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX3dyYXBwZXIuc3RvcHBlZD0yLHRoaXMuc3RvcHBlZD0yfSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbihlKXt0aGlzLl9ldmVudC5yZXR1cm5WYWx1ZT1lfHwhMSx0aGlzLl93cmFwcGVyLnByZXZlbnRlZD0xLHRoaXMucHJldmVudGVkPTF9fTtlLmV4dGVuZChuLGUuRE9NMkV2ZW50RmFjYWRlLGYpLGUuZXh0ZW5kKHIsZS5ET00yRXZlbnRGYWNhZGUsZiksci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2V2ZW50LHQ9dGhpcy5fd3JhcHBlci5vdmVycmlkZXMsbj1yLl9kZWZpbmUsaT1yLl9sYXp5UHJvcGVydGllcyxzO3RoaXMuYWx0S2V5PWUuYWx0S2V5LHRoaXMuY3RybEtleT1lLmN0cmxLZXksdGhpcy5tZXRhS2V5PWUubWV0YUtleSx0aGlzLnNoaWZ0S2V5PWUuc2hpZnRLZXksdGhpcy50eXBlPXQmJnQudHlwZXx8ZS50eXBlLHRoaXMuY2xpZW50WD1lLmNsaWVudFgsdGhpcy5jbGllbnRZPWUuY2xpZW50WSx0aGlzLmtleUNvZGU9dGhpcy5jaGFyQ29kZT1lLmtleUNvZGUsdGhpcy53aGljaD10aGlzLmJ1dHRvbj1lLmtleUNvZGV8fG9bZS5idXR0b25dfHxlLmJ1dHRvbjtmb3IocyBpbiBpKWkuaGFzT3duUHJvcGVydHkocykmJm4odGhpcyxzLGlbc10pO3RoaXMuX3RvdWNoJiZ0aGlzLl90b3VjaChlLHRoaXMuX2N1cnJlbnRUYXJnZXQsdGhpcy5fd3JhcHBlcil9LHIuX2xhenlQcm9wZXJ0aWVzPXt0YXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLl9ldmVudC5zcmNFbGVtZW50KX0scmVsYXRlZFRhcmdldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2V2ZW50LHQ9dVtlLnR5cGVdfHwicmVsYXRlZFRhcmdldCI7cmV0dXJuIGEoZVt0XXx8ZS5yZWxhdGVkVGFyZ2V0KX0sY3VycmVudFRhcmdldDpmdW5jdGlvbigpe3JldHVybiBhKHRoaXMuX2N1cnJlbnRUYXJnZXQpfSx3aGVlbERlbHRhOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fZXZlbnQ7aWYoZS50eXBlPT09Im1vdXNld2hlZWwifHxlLnR5cGU9PT0iRE9NTW91c2VTY3JvbGwiKXJldHVybiBlLmRldGFpbD9lLmRldGFpbCotMTpNYXRoLnJvdW5kKGUud2hlZWxEZWx0YS84MCl8fChlLndoZWVsRGVsdGE8MD8tMToxKX0scGFnZVg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9ldmVudCxuPXQucGFnZVgscixpLHM7cmV0dXJuIG49PT11bmRlZmluZWQmJihyPWUuY29uZmlnLmRvYyxpPXIuYm9keSYmci5ib2R5LnNjcm9sbExlZnQscz1yLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LG49dC5jbGllbnRYKyhzfHxpfHwwKSksbn0scGFnZVk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9ldmVudCxuPXQucGFnZVkscixpLHM7cmV0dXJuIG49PT11bmRlZmluZWQmJihyPWUuY29uZmlnLmRvYyxpPXIuYm9keSYmci5ib2R5LnNjcm9sbFRvcCxzPXIuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCxuPXQuY2xpZW50WSsoc3x8aXx8MCkpLG59fSxyLl9kZWZpbmU9ZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIocil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD9yOm4uY2FsbCh0aGlzKTtyZXR1cm4gZGVsZXRlIGVbdF0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6aSxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KSxpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpyLHNldDpyLGNvbmZpZ3VyYWJsZTohMH0pfTtpZihpJiYhaS5oYXNGZWF0dXJlKCJFdmVudHMiLCIyLjAiKSl7aWYocyl0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUuY29uZmlnLmRvYy5jcmVhdGVFdmVudE9iamVjdCgpLCJ6Iix7fSl9Y2F0Y2gobCl7cz0hMX1lLkRPTUV2ZW50RmFjYWRlPXM/cjpufX0sIjMuMTcuMiIse3JlcXVpcmVzOlsibm9kZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInBsdWdpbmhvc3QtYmFzZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKCl7dGhpcy5fcGx1Z2lucz17fX12YXIgbj1lLkxhbmc7ci5wcm90b3R5cGU9e3BsdWc6ZnVuY3Rpb24oZSx0KXt2YXIgcixpLHM7aWYobi5pc0FycmF5KGUpKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7cisrKXRoaXMucGx1ZyhlW3JdKTtlbHNlIGUmJiFuLmlzRnVuY3Rpb24oZSkmJih0PWUuY2ZnLGU9ZS5mbiksZSYmZS5OUyYmKHM9ZS5OUyx0PXR8fHt9LHQuaG9zdD10aGlzLHRoaXMuaGFzUGx1Z2luKHMpP3RoaXNbc10uc2V0QXR0cnMmJnRoaXNbc10uc2V0QXR0cnModCk6KHRoaXNbc109bmV3IGUodCksdGhpcy5fcGx1Z2luc1tzXT1lKSk7cmV0dXJuIHRoaXN9LHVucGx1ZzpmdW5jdGlvbihlKXt2YXIgdD1lLHI9dGhpcy5fcGx1Z2lucztpZihlKW4uaXNGdW5jdGlvbihlKSYmKHQ9ZS5OUyx0JiYoIXJbdF18fHJbdF0hPT1lKSYmKHQ9bnVsbCkpLHQmJih0aGlzW3RdJiYodGhpc1t0XS5kZXN0cm95JiZ0aGlzW3RdLmRlc3Ryb3koKSxkZWxldGUgdGhpc1t0XSksclt0XSYmZGVsZXRlIHJbdF0pO2Vsc2UgZm9yKHQgaW4gdGhpcy5fcGx1Z2lucyl0aGlzLl9wbHVnaW5zLmhhc093blByb3BlcnR5KHQpJiZ0aGlzLnVucGx1Zyh0KTtyZXR1cm4gdGhpc30saGFzUGx1Z2luOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wbHVnaW5zW2VdJiZ0aGlzW2VdfSxfaW5pdFBsdWdpbnM6ZnVuY3Rpb24oZSl7dGhpcy5fcGx1Z2lucz10aGlzLl9wbHVnaW5zfHx7fSx0aGlzLl9pbml0Q29uZmlnUGx1Z2lucyYmdGhpcy5faW5pdENvbmZpZ1BsdWdpbnMoZSl9LF9kZXN0cm95UGx1Z2luczpmdW5jdGlvbigpe3RoaXMudW5wbHVnKCl9fSxlLm5hbWVzcGFjZSgiUGx1Z2luIikuSG9zdD1yfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJwbHVnaW5ob3N0LWNvbmZpZyIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLlBsdWdpbi5Ib3N0LHI9ZS5MYW5nO24ucHJvdG90eXBlLl9pbml0Q29uZmlnUGx1Z2lucz1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRDbGFzc2VzP3RoaXMuX2dldENsYXNzZXMoKTpbdGhpcy5jb25zdHJ1Y3Rvcl0scj1bXSxpPXt9LHMsbyx1LGEsZjtmb3Iobz1uLmxlbmd0aC0xO28+PTA7by0tKXM9bltvXSxhPXMuX1VOUExVRyxhJiZlLm1peChpLGEsITApLHU9cy5fUExVRyx1JiZlLm1peChyLHUsITApO2ZvcihmIGluIHIpci5oYXNPd25Qcm9wZXJ0eShmKSYmKGlbZl18fHRoaXMucGx1ZyhyW2ZdKSk7dCYmdC5wbHVnaW5zJiZ0aGlzLnBsdWcodC5wbHVnaW5zKX0sbi5wbHVnPWZ1bmN0aW9uKHQsbixpKXt2YXIgcyxvLHUsYTtpZih0IT09ZS5CYXNlKXt0Ll9QTFVHPXQuX1BMVUd8fHt9LHIuaXNBcnJheShuKXx8KGkmJihuPXtmbjpuLGNmZzppfSksbj1bbl0pO2ZvcihvPTAsdT1uLmxlbmd0aDtvPHU7bysrKXM9bltvXSxhPXMuTkFNRXx8cy5mbi5OQU1FLHQuX1BMVUdbYV09c319LG4udW5wbHVnPWZ1bmN0aW9uKHQsbil7dmFyIGkscyxvLHU7aWYodCE9PWUuQmFzZSl7dC5fVU5QTFVHPXQuX1VOUExVR3x8e30sci5pc0FycmF5KG4pfHwobj1bbl0pO2ZvcihzPTAsbz1uLmxlbmd0aDtzPG87cysrKWk9bltzXSx1PWkuTkFNRSx0Ll9QTFVHW3VdP2RlbGV0ZSB0Ll9QTFVHW3VdOnQuX1VOUExVR1t1XT1pfX19LCIzLjE3LjIiLHtyZXF1aXJlczpbInBsdWdpbmhvc3QtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1kZWxlZ2F0ZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBmKHQscix1LGwpe3ZhciBjPW4oYXJndW1lbnRzLDAsITApLGg9aSh1KT91Om51bGwscCxkLHYsbSxnLHksYix3LEU7aWYocyh0KSl7dz1bXTtpZihvKHQpKWZvcih5PTAsYj10Lmxlbmd0aDt5PGI7Kyt5KWNbMF09dFt5XSx3LnB1c2goZS5kZWxlZ2F0ZS5hcHBseShlLGMpKTtlbHNle2MudW5zaGlmdChudWxsKTtmb3IoeSBpbiB0KXQuaGFzT3duUHJvcGVydHkoeSkmJihjWzBdPXksY1sxXT10W3ldLHcucHVzaChlLmRlbGVnYXRlLmFwcGx5KGUsYykpKX1yZXR1cm4gbmV3IGUuRXZlbnRIYW5kbGUodyl9cD10LnNwbGl0KC9cfC8pLHAubGVuZ3RoPjEmJihnPXAuc2hpZnQoKSxjWzBdPXQ9cC5zaGlmdCgpKSxkPWUuTm9kZS5ET01fRVZFTlRTW3RdLHMoZCkmJmQuZGVsZWdhdGUmJihFPWQuZGVsZWdhdGUuYXBwbHkoZCxhcmd1bWVudHMpKTtpZighRSl7aWYoIXR8fCFyfHwhdXx8IWwpcmV0dXJuO3Y9aD9lLlNlbGVjdG9yLnF1ZXJ5KGgsbnVsbCwhMCk6dSwhdiYmaSh1KSYmKEU9ZS5vbigiYXZhaWxhYmxlIixmdW5jdGlvbigpe2UubWl4KEUsZS5kZWxlZ2F0ZS5hcHBseShlLGMpLCEwKX0sdSkpLCFFJiZ2JiYoYy5zcGxpY2UoMiwyLHYpLEU9ZS5FdmVudC5fYXR0YWNoKGMse2ZhY2FkZTohMX0pLEUuc3ViLmZpbHRlcj1sLEUuc3ViLl9ub3RpZnk9Zi5ub3RpZnlTdWIpfXJldHVybiBFJiZnJiYobT1hW2ddfHwoYVtnXT17fSksbT1tW3RdfHwobVt0XT1bXSksbS5wdXNoKEUpKSxFfXZhciBuPWUuQXJyYXkscj1lLkxhbmcsaT1yLmlzU3RyaW5nLHM9ci5pc09iamVjdCxvPXIuaXNBcnJheSx1PWUuU2VsZWN0b3IudGVzdCxhPWUuRW52LmV2dC5oYW5kbGVzO2Yubm90aWZ5U3ViPWZ1bmN0aW9uKHQscixpKXtyPXIuc2xpY2UoKSx0aGlzLmFyZ3MmJnIucHVzaC5hcHBseShyLHRoaXMuYXJncyk7dmFyIHM9Zi5fYXBwbHlGaWx0ZXIodGhpcy5maWx0ZXIscixpKSxvLHUsYSxsO2lmKHMpe3M9bihzKSxvPXJbMF09bmV3IGUuRE9NRXZlbnRGYWNhZGUoclswXSxpLmVsLGkpLG8uY29udGFpbmVyPWUub25lKGkuZWwpO2Zvcih1PTAsYT1zLmxlbmd0aDt1PGEmJiFvLnN0b3BwZWQ7Kyt1KXtvLmN1cnJlbnRUYXJnZXQ9ZS5vbmUoc1t1XSksbD10aGlzLmZuLmFwcGx5KHRoaXMuY29udGV4dHx8by5jdXJyZW50VGFyZ2V0LHIpO2lmKGw9PT0hMSlicmVha31yZXR1cm4gbH19LGYuY29tcGlsZUZpbHRlcj1lLmNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gdSh0Ll9ub2RlLGUsbi5jdXJyZW50VGFyZ2V0PT09bi50YXJnZXQ/bnVsbDpuLmN1cnJlbnRUYXJnZXQuX25vZGUpfX0pLGYuX2Rpc2FibGVkUkU9L14oPzpidXR0b258aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaSxmLl9hcHBseUZpbHRlcj1mdW5jdGlvbih0LG4scil7dmFyIHM9blswXSxvPXIuZWwsYT1zLnRhcmdldHx8cy5zcmNFbGVtZW50LGw9W10sYz0hMTthLm5vZGVUeXBlPT09MyYmKGE9YS5wYXJlbnROb2RlKTtpZihhLmRpc2FibGVkJiZmLl9kaXNhYmxlZFJFLnRlc3QoYS5ub2RlTmFtZSkpcmV0dXJuIGw7bi51bnNoaWZ0KGEpO2lmKGkodCkpd2hpbGUoYSl7Yz1hPT09byx1KGEsdCxjP251bGw6bykmJmwucHVzaChhKTtpZihjKWJyZWFrO2E9YS5wYXJlbnROb2RlfWVsc2V7blswXT1lLm9uZShhKSxuWzFdPW5ldyBlLkRPTUV2ZW50RmFjYWRlKHMsbyxyKTt3aGlsZShhKXt0LmFwcGx5KG5bMF0sbikmJmwucHVzaChhKTtpZihhPT09bylicmVhazthPWEucGFyZW50Tm9kZSxuWzBdPWUub25lKGEpfW5bMV09c31yZXR1cm4gbC5sZW5ndGg8PTEmJihsPWxbMF0pLG4uc2hpZnQoKSxsfSxlLmRlbGVnYXRlPWUuRXZlbnQuZGVsZWdhdGU9Zn0sIjMuMTcuMiIse3JlcXVpcmVzOlsibm9kZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtZXZlbnQtZGVsZWdhdGUiLGZ1bmN0aW9uKGUsdCl7ZS5Ob2RlLnByb3RvdHlwZS5kZWxlZ2F0ZT1mdW5jdGlvbih0KXt2YXIgbj1lLkFycmF5KGFyZ3VtZW50cywwLCEwKSxyPWUuTGFuZy5pc09iamVjdCh0KSYmIWUuTGFuZy5pc0FycmF5KHQpPzE6MjtyZXR1cm4gbi5zcGxpY2UociwwLHRoaXMuX25vZGUpLGUuZGVsZWdhdGUuYXBwbHkoZSxuKX19LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWRlbGVnYXRlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtcGx1Z2luaG9zdCIsZnVuY3Rpb24oZSx0KXtlLk5vZGUucGx1Zz1mdW5jdGlvbigpe3ZhciB0PWUuQXJyYXkoYXJndW1lbnRzKTtyZXR1cm4gdC51bnNoaWZ0KGUuTm9kZSksZS5QbHVnaW4uSG9zdC5wbHVnLmFwcGx5KGUuQmFzZSx0KSxlLk5vZGV9LGUuTm9kZS51bnBsdWc9ZnVuY3Rpb24oKXt2YXIgdD1lLkFycmF5KGFyZ3VtZW50cyk7cmV0dXJuIHQudW5zaGlmdChlLk5vZGUpLGUuUGx1Z2luLkhvc3QudW5wbHVnLmFwcGx5KGUuQmFzZSx0KSxlLk5vZGV9LGUubWl4KGUuTm9kZSxlLlBsdWdpbi5Ib3N0LCExLG51bGwsMSksZS5PYmplY3QuZWFjaChlLk5vZGUuX2luc3RhbmNlcyxmdW5jdGlvbih0KXtlLlBsdWdpbi5Ib3N0LmFwcGx5KHQpfSksZS5Ob2RlTGlzdC5wcm90b3R5cGUucGx1Zz1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztyZXR1cm4gZS5Ob2RlTGlzdC5lYWNoKHRoaXMsZnVuY3Rpb24obil7ZS5Ob2RlLnByb3RvdHlwZS5wbHVnLmFwcGx5KGUub25lKG4pLHQpfSksdGhpc30sZS5Ob2RlTGlzdC5wcm90b3R5cGUudW5wbHVnPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiBlLk5vZGVMaXN0LmVhY2godGhpcyxmdW5jdGlvbihuKXtlLk5vZGUucHJvdG90eXBlLnVucGx1Zy5hcHBseShlLm9uZShuKSx0KX0pLHRoaXN9fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJub2RlLWJhc2UiLCJwbHVnaW5ob3N0Il19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImRvbS1zY3JlZW4iLGZ1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKGUpe3ZhciB0PSJkb2N1bWVudEVsZW1lbnQiLG49ImNvbXBhdE1vZGUiLHI9InBvc2l0aW9uIixpPSJmaXhlZCIscz0icmVsYXRpdmUiLG89ImxlZnQiLHU9InRvcCIsYT0iQmFja0NvbXBhdCIsZj0ibWVkaXVtIixsPSJib3JkZXJMZWZ0V2lkdGgiLGM9ImJvcmRlclRvcFdpZHRoIixoPSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLHA9ImdldENvbXB1dGVkU3R5bGUiLGQ9ZS5ET00sdj0vXnQoPzphYmxlfGR8aCkkL2ksbTtlLlVBLmllJiYoZS5jb25maWcuZG9jW25dIT09IkJhY2tDb21wYXQiP209dDptPSJib2R5IiksZS5taXgoZCx7d2luSGVpZ2h0OmZ1bmN0aW9uKGUpe3ZhciB0PWQuX2dldFdpblNpemUoZSkuaGVpZ2h0O3JldHVybiB0fSx3aW5XaWR0aDpmdW5jdGlvbihlKXt2YXIgdD1kLl9nZXRXaW5TaXplKGUpLndpZHRoO3JldHVybiB0fSxkb2NIZWlnaHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZC5fZ2V0RG9jU2l6ZShlKS5oZWlnaHQ7cmV0dXJuIE1hdGgubWF4KHQsZC5fZ2V0V2luU2l6ZShlKS5oZWlnaHQpfSxkb2NXaWR0aDpmdW5jdGlvbihlKXt2YXIgdD1kLl9nZXREb2NTaXplKGUpLndpZHRoO3JldHVybiBNYXRoLm1heCh0LGQuX2dldFdpblNpemUoZSkud2lkdGgpfSxkb2NTY3JvbGxYOmZ1bmN0aW9uKG4scil7cj1yfHxuP2QuX2dldERvYyhuKTplLmNvbmZpZy5kb2M7dmFyIGk9ci5kZWZhdWx0VmlldyxzPWk/aS5wYWdlWE9mZnNldDowO3JldHVybiBNYXRoLm1heChyW3RdLnNjcm9sbExlZnQsci5ib2R5LnNjcm9sbExlZnQscyl9LGRvY1Njcm9sbFk6ZnVuY3Rpb24obixyKXtyPXJ8fG4/ZC5fZ2V0RG9jKG4pOmUuY29uZmlnLmRvYzt2YXIgaT1yLmRlZmF1bHRWaWV3LHM9aT9pLnBhZ2VZT2Zmc2V0OjA7cmV0dXJuIE1hdGgubWF4KHJbdF0uc2Nyb2xsVG9wLHIuYm9keS5zY3JvbGxUb3Ascyl9LGdldFhZOmZ1bmN0aW9uKCl7cmV0dXJuIGUuY29uZmlnLmRvY1t0XVtoXT9mdW5jdGlvbihyKXt2YXIgaT1udWxsLHMsbyx1LGYsbCxjLHAsdixnLHk7aWYociYmci50YWdOYW1lKXtwPXIub3duZXJEb2N1bWVudCx1PXBbbl0sdSE9PWE/eT1wW3RdOnk9cC5ib2R5LHkuY29udGFpbnM/Zz15LmNvbnRhaW5zKHIpOmc9ZS5ET00uY29udGFpbnMoeSxyKTtpZihnKXt2PXAuZGVmYXVsdFZpZXcsdiYmInBhZ2VYT2Zmc2V0ImluIHY/KHM9di5wYWdlWE9mZnNldCxvPXYucGFnZVlPZmZzZXQpOihzPW0/cFttXS5zY3JvbGxMZWZ0OmQuZG9jU2Nyb2xsWChyLHApLG89bT9wW21dLnNjcm9sbFRvcDpkLmRvY1Njcm9sbFkocixwKSksZS5VQS5pZSYmKCFwLmRvY3VtZW50TW9kZXx8cC5kb2N1bWVudE1vZGU8OHx8dT09PWEpJiYobD15LmNsaWVudExlZnQsYz15LmNsaWVudFRvcCksZj1yW2hdKCksaT1bZi5sZWZ0LGYudG9wXTtpZihsfHxjKWlbMF0tPWwsaVsxXS09YztpZihvfHxzKWlmKCFlLlVBLmlvc3x8ZS5VQS5pb3M+PTQuMilpWzBdKz1zLGlbMV0rPW99ZWxzZSBpPWQuX2dldE9mZnNldChyKX1yZXR1cm4gaX06ZnVuY3Rpb24odCl7dmFyIG49bnVsbCxzLG8sdSxhLGY7aWYodClpZihkLmluRG9jKHQpKXtuPVt0Lm9mZnNldExlZnQsdC5vZmZzZXRUb3BdLHM9dC5vd25lckRvY3VtZW50LG89dCx1PWUuVUEuZ2Vja298fGUuVUEud2Via2l0PjUxOT8hMDohMTt3aGlsZShvPW8ub2Zmc2V0UGFyZW50KW5bMF0rPW8ub2Zmc2V0TGVmdCxuWzFdKz1vLm9mZnNldFRvcCx1JiYobj1kLl9jYWxjQm9yZGVycyhvLG4pKTtpZihkLmdldFN0eWxlKHQscikhPWkpe289dDt3aGlsZShvPW8ucGFyZW50Tm9kZSl7YT1vLnNjcm9sbFRvcCxmPW8uc2Nyb2xsTGVmdCxlLlVBLmdlY2tvJiZkLmdldFN0eWxlKG8sIm92ZXJmbG93IikhPT0idmlzaWJsZSImJihuPWQuX2NhbGNCb3JkZXJzKG8sbikpO2lmKGF8fGYpblswXS09ZixuWzFdLT1hfW5bMF0rPWQuZG9jU2Nyb2xsWCh0LHMpLG5bMV0rPWQuZG9jU2Nyb2xsWSh0LHMpfWVsc2UgblswXSs9ZC5kb2NTY3JvbGxYKHQscyksblsxXSs9ZC5kb2NTY3JvbGxZKHQscyl9ZWxzZSBuPWQuX2dldE9mZnNldCh0KTtyZXR1cm4gbn19KCksZ2V0U2Nyb2xsYmFyV2lkdGg6ZS5jYWNoZWQoZnVuY3Rpb24oKXt2YXIgdD1lLmNvbmZpZy5kb2Msbj10LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHI9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGk9LjE7cmV0dXJuIHImJihuLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO3Zpc2liaWxpdHk6aGlkZGVuO292ZXJmbG93OnNjcm9sbDt3aWR0aDoyMHB4OyIsbi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoInAiKSkuc3R5bGUuaGVpZ2h0PSIxcHgiLHIuaW5zZXJ0QmVmb3JlKG4sci5maXJzdENoaWxkKSxpPW4ub2Zmc2V0V2lkdGgtbi5jbGllbnRXaWR0aCxyLnJlbW92ZUNoaWxkKG4pKSxpfSxudWxsLC4xKSxnZXRYOmZ1bmN0aW9uKGUpe3JldHVybiBkLmdldFhZKGUpWzBdfSxnZXRZOmZ1bmN0aW9uKGUpe3JldHVybiBkLmdldFhZKGUpWzFdfSxzZXRYWTpmdW5jdGlvbihlLHQsbil7dmFyIGk9ZC5zZXRTdHlsZSxhLGYsbCxjO2UmJnQmJihhPWQuZ2V0U3R5bGUoZSxyKSxmPWQuX2dldE9mZnNldChlKSxhPT0ic3RhdGljIiYmKGE9cyxpKGUscixhKSksYz1kLmdldFhZKGUpLHRbMF0hPT1udWxsJiZpKGUsbyx0WzBdLWNbMF0rZlswXSsicHgiKSx0WzFdIT09bnVsbCYmaShlLHUsdFsxXS1jWzFdK2ZbMV0rInB4Iiksbnx8KGw9ZC5nZXRYWShlKSwobFswXSE9PXRbMF18fGxbMV0hPT10WzFdKSYmZC5zZXRYWShlLHQsITApKSl9LHNldFg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZC5zZXRYWShlLFt0LG51bGxdKX0sc2V0WTpmdW5jdGlvbihlLHQpe3JldHVybiBkLnNldFhZKGUsW251bGwsdF0pfSxzd2FwWFk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1kLmdldFhZKGUpO2Quc2V0WFkoZSxkLmdldFhZKHQpKSxkLnNldFhZKHQsbil9LF9jYWxjQm9yZGVyczpmdW5jdGlvbih0LG4pe3ZhciByPXBhcnNlSW50KGRbcF0odCxjKSwxMCl8fDAsaT1wYXJzZUludChkW3BdKHQsbCksMTApfHwwO3JldHVybiBlLlVBLmdlY2tvJiZ2LnRlc3QodC50YWdOYW1lKSYmKHI9MCxpPTApLG5bMF0rPWksblsxXSs9cixufSxfZ2V0V2luU2l6ZTpmdW5jdGlvbihyLGkpe2k9aXx8cj9kLl9nZXREb2Mocik6ZS5jb25maWcuZG9jO3ZhciBzPWkuZGVmYXVsdFZpZXd8fGkucGFyZW50V2luZG93LG89aVtuXSx1PXMuaW5uZXJIZWlnaHQsYT1zLmlubmVyV2lkdGgsZj1pW3RdO3JldHVybiBvJiYhZS5VQS5vcGVyYSYmKG8hPSJDU1MxQ29tcGF0IiYmKGY9aS5ib2R5KSx1PWYuY2xpZW50SGVpZ2h0LGE9Zi5jbGllbnRXaWR0aCkse2hlaWdodDp1LHdpZHRoOmF9fSxfZ2V0RG9jU2l6ZTpmdW5jdGlvbihyKXt2YXIgaT1yP2QuX2dldERvYyhyKTplLmNvbmZpZy5kb2Mscz1pW3RdO3JldHVybiBpW25dIT0iQ1NTMUNvbXBhdCImJihzPWkuYm9keSkse2hlaWdodDpzLnNjcm9sbEhlaWdodCx3aWR0aDpzLnNjcm9sbFdpZHRofX19KX0pKGUpLGZ1bmN0aW9uKGUpe3ZhciB0PSJ0b3AiLG49InJpZ2h0IixyPSJib3R0b20iLGk9ImxlZnQiLHM9ZnVuY3Rpb24oZSxzKXt2YXIgbz1NYXRoLm1heChlW3RdLHNbdF0pLHU9TWF0aC5taW4oZVtuXSxzW25dKSxhPU1hdGgubWluKGVbcl0sc1tyXSksZj1NYXRoLm1heChlW2ldLHNbaV0pLGw9e307cmV0dXJuIGxbdF09byxsW25dPXUsbFtyXT1hLGxbaV09ZixsfSxvPWUuRE9NO2UubWl4KG8se3JlZ2lvbjpmdW5jdGlvbihlKXt2YXIgdD1vLmdldFhZKGUpLG49ITE7cmV0dXJuIGUmJnQmJihuPW8uX2dldFJlZ2lvbih0WzFdLHRbMF0rZS5vZmZzZXRXaWR0aCx0WzFdK2Uub2Zmc2V0SGVpZ2h0LHRbMF0pKSxufSxpbnRlcnNlY3Q6ZnVuY3Rpb24odSxhLGYpe3ZhciBsPWZ8fG8ucmVnaW9uKHUpLGM9e30saD1hLHA7aWYoaC50YWdOYW1lKWM9by5yZWdpb24oaCk7ZWxzZXtpZighZS5MYW5nLmlzT2JqZWN0KGEpKXJldHVybiExO2M9YX1yZXR1cm4gcD1zKGMsbCkse3RvcDpwW3RdLHJpZ2h0OnBbbl0sYm90dG9tOnBbcl0sbGVmdDpwW2ldLGFyZWE6KHBbcl0tcFt0XSkqKHBbbl0tcFtpXSkseW9mZjpwW3JdLXBbdF0seG9mZjpwW25dLXBbaV0saW5SZWdpb246by5pblJlZ2lvbih1LGEsITEsZil9fSxpblJlZ2lvbjpmdW5jdGlvbih1LGEsZixsKXt2YXIgYz17fSxoPWx8fG8ucmVnaW9uKHUpLHA9YSxkO2lmKHAudGFnTmFtZSljPW8ucmVnaW9uKHApO2Vsc2V7aWYoIWUuTGFuZy5pc09iamVjdChhKSlyZXR1cm4hMTtjPWF9cmV0dXJuIGY/aFtpXT49Y1tpXSYmaFtuXTw9Y1tuXSYmaFt0XT49Y1t0XSYmaFtyXTw9Y1tyXTooZD1zKGMsaCksZFtyXT49ZFt0XSYmZFtuXT49ZFtpXT8hMDohMSl9LGluVmlld3BvcnRSZWdpb246ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBvLmluUmVnaW9uKGUsby52aWV3cG9ydFJlZ2lvbihlKSx0LG4pfSxfZ2V0UmVnaW9uOmZ1bmN0aW9uKGUscyxvLHUpe3ZhciBhPXt9O3JldHVybiBhW3RdPWFbMV09ZSxhW2ldPWFbMF09dSxhW3JdPW8sYVtuXT1zLGEud2lkdGg9YVtuXS1hW2ldLGEuaGVpZ2h0PWFbcl0tYVt0XSxhfSx2aWV3cG9ydFJlZ2lvbjpmdW5jdGlvbih0KXt0PXR8fGUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnQ7dmFyIG49ITEscixpO3JldHVybiB0JiYocj1vLmRvY1Njcm9sbFgodCksaT1vLmRvY1Njcm9sbFkodCksbj1vLl9nZXRSZWdpb24oaSxvLndpbldpZHRoKHQpK3IsaStvLndpbkhlaWdodCh0KSxyKSksbn19KX0oZSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1iYXNlIiwiZG9tLXN0eWxlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIm5vZGUtc2NyZWVuIixmdW5jdGlvbihlLHQpe2UuZWFjaChbIndpbldpZHRoIiwid2luSGVpZ2h0IiwiZG9jV2lkdGgiLCJkb2NIZWlnaHQiLCJkb2NTY3JvbGxYIiwiZG9jU2Nyb2xsWSJdLGZ1bmN0aW9uKHQpe2UuTm9kZS5BVFRSU1t0XT17Z2V0dGVyOmZ1bmN0aW9uKCl7dmFyIG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gbi51bnNoaWZ0KGUuTm9kZS5nZXRET01Ob2RlKHRoaXMpKSxlLkRPTVt0XS5hcHBseSh0aGlzLG4pfX19KSxlLk5vZGUuQVRUUlMuc2Nyb2xsTGVmdD17Z2V0dGVyOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5Ob2RlLmdldERPTU5vZGUodGhpcyk7cmV0dXJuInNjcm9sbExlZnQiaW4gdD90LnNjcm9sbExlZnQ6ZS5ET00uZG9jU2Nyb2xsWCh0KX0sc2V0dGVyOmZ1bmN0aW9uKHQpe3ZhciBuPWUuTm9kZS5nZXRET01Ob2RlKHRoaXMpO24mJigic2Nyb2xsTGVmdCJpbiBuP24uc2Nyb2xsTGVmdD10OihuLmRvY3VtZW50fHxuLm5vZGVUeXBlPT09OSkmJmUuRE9NLl9nZXRXaW4obikuc2Nyb2xsVG8odCxlLkRPTS5kb2NTY3JvbGxZKG4pKSl9fSxlLk5vZGUuQVRUUlMuc2Nyb2xsVG9wPXtnZXR0ZXI6ZnVuY3Rpb24oKXt2YXIgdD1lLk5vZGUuZ2V0RE9NTm9kZSh0aGlzKTtyZXR1cm4ic2Nyb2xsVG9wImluIHQ/dC5zY3JvbGxUb3A6ZS5ET00uZG9jU2Nyb2xsWSh0KX0sc2V0dGVyOmZ1bmN0aW9uKHQpe3ZhciBuPWUuTm9kZS5nZXRET01Ob2RlKHRoaXMpO24mJigic2Nyb2xsVG9wImluIG4/bi5zY3JvbGxUb3A9dDoobi5kb2N1bWVudHx8bi5ub2RlVHlwZT09PTkpJiZlLkRPTS5fZ2V0V2luKG4pLnNjcm9sbFRvKGUuRE9NLmRvY1Njcm9sbFgobiksdCkpfX0sZS5Ob2RlLmltcG9ydE1ldGhvZChlLkRPTSxbImdldFhZIiwic2V0WFkiLCJnZXRYIiwic2V0WCIsImdldFkiLCJzZXRZIiwic3dhcFhZIl0pLGUuTm9kZS5BVFRSUy5yZWdpb249e2dldHRlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0RE9NTm9kZSgpLG47cmV0dXJuIHQmJiF0LnRhZ05hbWUmJnQubm9kZVR5cGU9PT05JiYodD10LmRvY3VtZW50RWxlbWVudCksZS5ET00uaXNXaW5kb3codCk/bj1lLkRPTS52aWV3cG9ydFJlZ2lvbih0KTpuPWUuRE9NLnJlZ2lvbih0KSxufX0sZS5Ob2RlLkFUVFJTLnZpZXdwb3J0UmVnaW9uPXtnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gZS5ET00udmlld3BvcnRSZWdpb24oZS5Ob2RlLmdldERPTU5vZGUodGhpcykpfX0sZS5Ob2RlLmltcG9ydE1ldGhvZChlLkRPTSwiaW5WaWV3cG9ydFJlZ2lvbiIpLGUuTm9kZS5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5Ob2RlLmdldERPTU5vZGUodGhpcyk7cmV0dXJuIGUuaW5zdGFuY2VPZih0LGUuTm9kZSkmJih0PWUuTm9kZS5nZXRET01Ob2RlKHQpKSxlLkRPTS5pbnRlcnNlY3Qocix0LG4pfSxlLk5vZGUucHJvdG90eXBlLmluUmVnaW9uPWZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLk5vZGUuZ2V0RE9NTm9kZSh0aGlzKTtyZXR1cm4gZS5pbnN0YW5jZU9mKHQsZS5Ob2RlKSYmKHQ9ZS5Ob2RlLmdldERPTU5vZGUodCkpLGUuRE9NLmluUmVnaW9uKGksdCxuLHIpfX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZG9tLXNjcmVlbiIsIm5vZGUtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJub2RlLXN0eWxlIixmdW5jdGlvbihlLHQpeyhmdW5jdGlvbihlKXtlLm1peChlLk5vZGUucHJvdG90eXBlLHtzZXRTdHlsZTpmdW5jdGlvbih0LG4pe3JldHVybiBlLkRPTS5zZXRTdHlsZSh0aGlzLl9ub2RlLHQsbiksdGhpc30sc2V0U3R5bGVzOmZ1bmN0aW9uKHQpe3JldHVybiBlLkRPTS5zZXRTdHlsZXModGhpcy5fbm9kZSx0KSx0aGlzfSxnZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gZS5ET00uZ2V0U3R5bGUodGhpcy5fbm9kZSx0KX0sZ2V0Q29tcHV0ZWRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gZS5ET00uZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9ub2RlLHQpfX0pLGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJnZXRTdHlsZSIsImdldENvbXB1dGVkU3R5bGUiLCJzZXRTdHlsZSIsInNldFN0eWxlcyJdKX0pKGUpO3ZhciBuPWUuTm9kZTtlLm1peChuLnByb3RvdHlwZSx7c2hvdzpmdW5jdGlvbihlKXtyZXR1cm4gZT1hcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXSx0aGlzLnRvZ2dsZVZpZXcoITAsZSksdGhpc30sX3Nob3c6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIiksdGhpcy5zZXRTdHlsZSgiZGlzcGxheSIsIiIpfSxfaXNIaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoImhpZGRlbiIpfHxlLkRPTS5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX25vZGUsImRpc3BsYXkiKT09PSJub25lIn0sdG9nZ2xlVmlldzpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl90b2dnbGVWaWV3LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzfSxfdG9nZ2xlVmlldzpmdW5jdGlvbihlLHQpe3JldHVybiB0PWFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdLHR5cGVvZiBlIT0iYm9vbGVhbiImJihlPXRoaXMuX2lzSGlkZGVuKCk/MTowKSxlP3RoaXMuX3Nob3coKTp0aGlzLl9oaWRlKCksdHlwZW9mIHQ9PSJmdW5jdGlvbiImJnQuY2FsbCh0aGlzKSx0aGlzfSxoaWRlOmZ1bmN0aW9uKGUpe3JldHVybiBlPWFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdLHRoaXMudG9nZ2xlVmlldyghMSxlKSx0aGlzfSxfaGlkZTpmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCJoaWRkZW4iKSx0aGlzLnNldFN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpfX0pLGUuTm9kZUxpc3QuaW1wb3J0TWV0aG9kKGUuTm9kZS5wcm90b3R5cGUsWyJzaG93IiwiaGlkZSIsInRvZ2dsZVZpZXciXSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImRvbS1zdHlsZSIsIm5vZGUtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJxdWVyeXN0cmluZy1zdHJpbmdpZnktc2ltcGxlIixmdW5jdGlvbihlLHQpe3ZhciBuPWUubmFtZXNwYWNlKCJRdWVyeVN0cmluZyIpLHI9ZW5jb2RlVVJJQ29tcG9uZW50O24uc3RyaW5naWZ5PWZ1bmN0aW9uKHQsbil7dmFyIGk9W10scz1uJiZuLmFycmF5S2V5PyEwOiExLG8sdSxhO2ZvcihvIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShvKSlpZihlLkxhbmcuaXNBcnJheSh0W29dKSlmb3IodT0wLGE9dFtvXS5sZW5ndGg7dTxhO3UrKylpLnB1c2gocihzP28rIltdIjpvKSsiPSIrcih0W29dW3VdKSk7ZWxzZSBpLnB1c2gocihvKSsiPSIrcih0W29dKSk7cmV0dXJuIGkuam9pbigiJiIpfX0sIjMuMTcuMiIse3JlcXVpcmVzOlsieXVpLWJhc2UiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiaW8tYmFzZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBvKHQpe3ZhciBuPXRoaXM7bi5fdWlkPSJpbzoiK3MrKyxuLl9pbml0KHQpLGUuaW8uX21hcFtuLl91aWRdPW59dmFyIG49WyJzdGFydCIsImNvbXBsZXRlIiwiZW5kIiwic3VjY2VzcyIsImZhaWx1cmUiLCJwcm9ncmVzcyJdLHI9WyJzdGF0dXMiLCJzdGF0dXNUZXh0IiwicmVzcG9uc2VUZXh0IiwicmVzcG9uc2VYTUwiXSxpPWUuY29uZmlnLndpbixzPTA7by5wcm90b3R5cGU9e19pZDowLF9oZWFkZXJzOnsiWC1SZXF1ZXN0ZWQtV2l0aCI6IlhNTEh0dHBSZXF1ZXN0In0sX3RpbWVvdXQ6e30sX2luaXQ6ZnVuY3Rpb24odCl7dmFyIHI9dGhpcyxpLHM7ci5jZmc9dHx8e30sZS5hdWdtZW50KHIsZS5FdmVudFRhcmdldCk7Zm9yKGk9MCxzPW4ubGVuZ3RoO2k8czsrK2kpci5wdWJsaXNoKCJpbzoiK25baV0sZS5tZXJnZSh7YnJvYWRjYXN0OjF9LHQpKSxyLnB1Ymxpc2goImlvLXRybjoiK25baV0sdCl9LF9jcmVhdGU6ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzLHM9e2lkOmUuTGFuZy5pc051bWJlcihuKT9uOnIuX2lkKyssdWlkOnIuX3VpZH0sbz10Lnhkcj90Lnhkci51c2U6bnVsbCx1PXQuZm9ybSYmdC5mb3JtLnVwbG9hZD8iaWZyYW1lIjpudWxsLGE7cmV0dXJuIG89PT0ibmF0aXZlIiYmKG89ZS5VQS5pZSYmIWw/InhkciI6bnVsbCxyLnNldEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIpKSxhPW98fHUscz1hP2UubWVyZ2UoZS5JTy5jdXN0b21UcmFuc3BvcnQoYSkscyk6ZS5tZXJnZShlLklPLmRlZmF1bHRUcmFuc3BvcnQoKSxzKSxzLm5vdGlmeSYmKHQubm90aWZ5PWZ1bmN0aW9uKGUsdCxuKXtyLm5vdGlmeShlLHQsbil9KSxhfHxpJiZpLkZvcm1EYXRhJiZ0LmRhdGEgaW5zdGFuY2VvZiBpLkZvcm1EYXRhJiYocy5jLnVwbG9hZC5vbnByb2dyZXNzPWZ1bmN0aW9uKGUpe3IucHJvZ3Jlc3MocyxlLHQpfSxzLmMub25sb2FkPWZ1bmN0aW9uKGUpe3IubG9hZChzLGUsdCl9LHMuYy5vbmVycm9yPWZ1bmN0aW9uKGUpe3IuZXJyb3IocyxlLHQpfSxzLnVwbG9hZD0hMCksc30sX2Rlc3Ryb3k6ZnVuY3Rpb24odCl7aSYmIXQubm90aWZ5JiYhdC54ZHImJih1JiYhdC51cGxvYWQ/dC5jLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsOnQudXBsb2FkPyh0LmMudXBsb2FkLm9ucHJvZ3Jlc3M9bnVsbCx0LmMub25sb2FkPW51bGwsdC5jLm9uZXJyb3I9bnVsbCk6ZS5VQS5pZSYmIXQuZSYmdC5jLmFib3J0KCkpLHQ9dC5jPW51bGx9LF9ldnQ6ZnVuY3Rpb24odCxyLGkpe3ZhciBzPXRoaXMsbyx1PWkuYXJndW1lbnRzLGE9cy5jZmcuZW1pdEZhY2FkZSxmPSJpbzoiK3QsbD0iaW8tdHJuOiIrdDt0aGlzLmRldGFjaChsKSxyLmUmJihyLmM9e3N0YXR1czowLHN0YXR1c1RleHQ6ci5lfSksbz1bYT97aWQ6ci5pZCxkYXRhOnIuYyxjZmc6aSxhcmd1bWVudHM6dX06ci5pZF0sYXx8KHQ9PT1uWzBdfHx0PT09blsyXT91JiZvLnB1c2godSk6KHIuZXZ0P28ucHVzaChyLmV2dCk6by5wdXNoKHIuYyksdSYmby5wdXNoKHUpKSksby51bnNoaWZ0KGYpLHMuZmlyZS5hcHBseShzLG8pLGkub24mJihvWzBdPWwscy5vbmNlKGwsaS5vblt0XSxpLmNvbnRleHR8fGUpLHMuZmlyZS5hcHBseShzLG8pKX0sc3RhcnQ6ZnVuY3Rpb24oZSx0KXt0aGlzLl9ldnQoblswXSxlLHQpfSxjb21wbGV0ZTpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzFdLGUsdCl9LGVuZDpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzJdLGUsdCksdGhpcy5fZGVzdHJveShlKX0sc3VjY2VzczpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzNdLGUsdCksdGhpcy5lbmQoZSx0KX0sZmFpbHVyZTpmdW5jdGlvbihlLHQpe3RoaXMuX2V2dChuWzRdLGUsdCksdGhpcy5lbmQoZSx0KX0scHJvZ3Jlc3M6ZnVuY3Rpb24oZSx0LHIpe2UuZXZ0PXQsdGhpcy5fZXZ0KG5bNV0sZSxyKX0sbG9hZDpmdW5jdGlvbihlLHQscil7ZS5ldnQ9dC50YXJnZXQsdGhpcy5fZXZ0KG5bMV0sZSxyKX0sZXJyb3I6ZnVuY3Rpb24oZSx0LHIpe2UuZXZ0PXQsdGhpcy5fZXZ0KG5bNF0sZSxyKX0sX3JldHJ5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fZGVzdHJveShlKSxuLnhkci51c2U9ImZsYXNoIix0aGlzLnNlbmQodCxuLGUuaWQpfSxfY29uY2F0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUrPShlLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK3QsZX0sc2V0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7dD90aGlzLl9oZWFkZXJzW2VdPXQ6ZGVsZXRlIHRoaXMuX2hlYWRlcnNbZV19LF9zZXRIZWFkZXJzOmZ1bmN0aW9uKHQsbil7bj1lLm1lcmdlKHRoaXMuX2hlYWRlcnMsbiksZS5PYmplY3QuZWFjaChuLGZ1bmN0aW9uKGUscil7ZSE9PSJkaXNhYmxlIiYmdC5zZXRSZXF1ZXN0SGVhZGVyKHIsbltyXSl9KX0sX3N0YXJ0VGltZW91dDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7bi5fdGltZW91dFtlLmlkXT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5fYWJvcnQoZSwidGltZW91dCIpfSx0KX0sX2NsZWFyVGltZW91dDpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dFtlXSksZGVsZXRlIHRoaXMuX3RpbWVvdXRbZV19LF9yZXN1bHQ6ZnVuY3Rpb24oZSx0KXt2YXIgbjt0cnl7bj1lLmMuc3RhdHVzfWNhdGNoKHIpe249MH1uPj0yMDAmJm48MzAwfHxuPT09MzA0fHxuPT09MTIyMz90aGlzLnN1Y2Nlc3MoZSx0KTp0aGlzLmZhaWx1cmUoZSx0KX0sX3JTOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztlLmMucmVhZHlTdGF0ZT09PTQmJih0LnRpbWVvdXQmJm4uX2NsZWFyVGltZW91dChlLmlkKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5jb21wbGV0ZShlLHQpLG4uX3Jlc3VsdChlLHQpfSwwKSl9LF9hYm9ydDpmdW5jdGlvbihlLHQpe2UmJmUuYyYmKGUuZT10LGUuYy5hYm9ydCgpKX0sc2VuZDpmdW5jdGlvbih0LG4saSl7dmFyIHMsbyx1LGEsZixjLGg9dGhpcyxwPXQsZD17fTtuPW4/ZS5PYmplY3Qobik6e30scz1oLl9jcmVhdGUobixpKSxvPW4ubWV0aG9kP24ubWV0aG9kLnRvVXBwZXJDYXNlKCk6IkdFVCIsZj1uLnN5bmMsYz1uLmRhdGEsZS5MYW5nLmlzT2JqZWN0KGMpJiYhYy5ub2RlVHlwZSYmIXMudXBsb2FkJiZlLlF1ZXJ5U3RyaW5nJiZlLlF1ZXJ5U3RyaW5nLnN0cmluZ2lmeSYmKG4uZGF0YT1jPWUuUXVlcnlTdHJpbmcuc3RyaW5naWZ5KGMpKTtpZihuLmZvcm0pe2lmKG4uZm9ybS51cGxvYWQpcmV0dXJuIGgudXBsb2FkKHMsdCxuKTtjPWguX3NlcmlhbGl6ZShuLmZvcm0sYyl9Y3x8KGM9IiIpO2lmKGMpc3dpdGNoKG8pe2Nhc2UiR0VUIjpjYXNlIkhFQUQiOmNhc2UiREVMRVRFIjpwPWguX2NvbmNhdChwLGMpLGM9IiI7YnJlYWs7Y2FzZSJQT1NUIjpjYXNlIlBVVCI6bi5oZWFkZXJzPWUubWVyZ2UoeyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgifSxuLmhlYWRlcnMpfWlmKHMueGRyKXJldHVybiBoLnhkcihwLHMsbik7aWYocy5ub3RpZnkpcmV0dXJuIHMuYy5zZW5kKHMsdCxuKTshZiYmIXMudXBsb2FkJiYocy5jLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2guX3JTKHMsbil9KTt0cnl7cy5jLm9wZW4obyxwLCFmLG4udXNlcm5hbWV8fG51bGwsbi5wYXNzd29yZHx8bnVsbCksaC5fc2V0SGVhZGVycyhzLmMsbi5oZWFkZXJzfHx7fSksaC5zdGFydChzLG4pLG4ueGRyJiZuLnhkci5jcmVkZW50aWFscyYmbCYmKHMuYy53aXRoQ3JlZGVudGlhbHM9ITApLHMuYy5zZW5kKGMpO2lmKGYpe2Zvcih1PTAsYT1yLmxlbmd0aDt1PGE7Kyt1KWRbclt1XV09cy5jW3JbdV1dO3JldHVybiBkLmdldEFsbFJlc3BvbnNlSGVhZGVycz1mdW5jdGlvbigpe3JldHVybiBzLmMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCl9LGQuZ2V0UmVzcG9uc2VIZWFkZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuYy5nZXRSZXNwb25zZUhlYWRlcihlKX0saC5jb21wbGV0ZShzLG4pLGguX3Jlc3VsdChzLG4pLGR9fWNhdGNoKHYpe2lmKHMueGRyKXJldHVybiBoLl9yZXRyeShzLHQsbik7aC5jb21wbGV0ZShzLG4pLGguX3Jlc3VsdChzLG4pfXJldHVybiBuLnRpbWVvdXQmJmguX3N0YXJ0VGltZW91dChzLG4udGltZW91dCkse2lkOnMuaWQsYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5jP2guX2Fib3J0KHMsImFib3J0Iik6ITF9LGlzSW5Qcm9ncmVzczpmdW5jdGlvbigpe3JldHVybiBzLmM/cy5jLnJlYWR5U3RhdGUlNDohMX0saW86aH19fSxlLmlvPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5pby5fbWFwWyJpbzowIl18fG5ldyBvO3JldHVybiByLnNlbmQuYXBwbHkocixbdCxuXSl9LGUuaW8uaGVhZGVyPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5pby5fbWFwWyJpbzowIl18fG5ldyBvO3Iuc2V0SGVhZGVyKHQsbil9LGUuSU89byxlLmlvLl9tYXA9e307dmFyIHU9aSYmaS5YTUxIdHRwUmVxdWVzdCxhPWkmJmkuWERvbWFpblJlcXVlc3QsZj1pJiZpLkFjdGl2ZVhPYmplY3QsbD11JiYid2l0aENyZWRlbnRpYWxzImluIG5ldyBYTUxIdHRwUmVxdWVzdDtlLm1peChlLklPLHtfZGVmYXVsdDoieGhyIixkZWZhdWx0VHJhbnNwb3J0OmZ1bmN0aW9uKHQpe2lmKCF0KXt2YXIgbj17YzplLklPLnRyYW5zcG9ydHNbZS5JTy5fZGVmYXVsdF0oKSxub3RpZnk6ZS5JTy5fZGVmYXVsdD09PSJ4aHIiPyExOiEwfTtyZXR1cm4gbn1lLklPLl9kZWZhdWx0PXR9LHRyYW5zcG9ydHM6e3hocjpmdW5jdGlvbigpe3JldHVybiB1P25ldyBYTUxIdHRwUmVxdWVzdDpmP25ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOm51bGx9LHhkcjpmdW5jdGlvbigpe3JldHVybiBhP25ldyBYRG9tYWluUmVxdWVzdDpudWxsfSxpZnJhbWU6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZmxhc2g6bnVsbCxub2RlanM6bnVsbH0sY3VzdG9tVHJhbnNwb3J0OmZ1bmN0aW9uKHQpe3ZhciBuPXtjOmUuSU8udHJhbnNwb3J0c1t0XSgpfTtyZXR1cm4gblt0PT09InhkciJ8fHQ9PT0iZmxhc2giPyJ4ZHIiOiJub3RpZnkiXT0hMCxufX0pLGUubWl4KGUuSU8ucHJvdG90eXBlLHtub3RpZnk6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7c3dpdGNoKGUpe2Nhc2UidGltZW91dCI6Y2FzZSJhYm9ydCI6Y2FzZSJ0cmFuc3BvcnQgZXJyb3IiOnQuYz17c3RhdHVzOjAsc3RhdHVzVGV4dDplfSxlPSJmYWlsdXJlIjtkZWZhdWx0OnJbZV0uYXBwbHkocixbdCxuXSl9fX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSIsInF1ZXJ5c3RyaW5nLXN0cmluZ2lmeS1zaW1wbGUiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgianNvbi1wYXJzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbmZpZy5nbG9iYWwuSlNPTjtlLm5hbWVzcGFjZSgiSlNPTiIpLnBhcnNlPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gbi5wYXJzZSh0eXBlb2YgZT09InN0cmluZyI/ZTplKyIiLHQscil9fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ0cmFuc2l0aW9uIixmdW5jdGlvbihlLHQpe3ZhciBuPSIiLHI9IiIsaT1lLmNvbmZpZy5kb2Mscz0iZG9jdW1lbnRFbGVtZW50IixvPWlbc10uc3R5bGUsdT0idHJhbnNpdGlvbiIsYT0idHJhbnNpdGlvblByb3BlcnR5IixmLGwsYyxoLHAsZCx2PXt9LG09WyJXZWJraXQiLCJNb3oiXSxnPXtXZWJraXQ6IndlYmtpdFRyYW5zaXRpb25FbmQifSx5PWZ1bmN0aW9uKCl7dGhpcy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX07eS5fVFJBTlNGT1JNPSJ0cmFuc2Zvcm0iLHkuX3RvQ2FtZWw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKC8tKFthLXpdKS9naSxmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9KSxlfSx5Ll90b0h5cGhlbj1mdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoLyhbQS1aXT8pKFthLXpdKykoW0EtWl0/KS9nLGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPSh0PyItIit0LnRvTG93ZXJDYXNlKCk6IiIpK247cmV0dXJuIHImJihpKz0iLSIrci50b0xvd2VyQ2FzZSgpKSxpfSksZX0seS5TSE9XX1RSQU5TSVRJT049ImZhZGVJbiIseS5ISURFX1RSQU5TSVRJT049ImZhZGVPdXQiLHkudXNlTmF0aXZlPSExLCJ0cmFuc2l0aW9uImluIG8mJiJ0cmFuc2l0aW9uUHJvcGVydHkiaW4gbyYmInRyYW5zaXRpb25EdXJhdGlvbiJpbiBvJiYidHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uImluIG8mJiJ0cmFuc2l0aW9uRGVsYXkiaW4gbz8oeS51c2VOYXRpdmU9ITAseS5zdXBwb3J0ZWQ9ITApOmUuQXJyYXkuZWFjaChtLGZ1bmN0aW9uKGUpe3ZhciB0PWUrIlRyYW5zaXRpb24iO3QgaW4gaVtzXS5zdHlsZSYmKG49ZSxyPXkuX3RvSHlwaGVuKGUpKyItIix5LnVzZU5hdGl2ZT0hMCx5LnN1cHBvcnRlZD0hMCx5Ll9WRU5ET1JfUFJFRklYPWUpfSksdHlwZW9mIG8udHJhbnNmb3JtPT0idW5kZWZpbmVkIiYmZS5BcnJheS5lYWNoKG0sZnVuY3Rpb24oZSl7dmFyIHQ9ZSsiVHJhbnNmb3JtIjt0eXBlb2Ygb1t0XSE9InVuZGVmaW5lZCImJih5Ll9UUkFOU0ZPUk09dCl9KSxuJiYodT1uKyJUcmFuc2l0aW9uIixhPW4rIlRyYW5zaXRpb25Qcm9wZXJ0eSIpLGY9cisidHJhbnNpdGlvbi1wcm9wZXJ0eSIsbD1yKyJ0cmFuc2l0aW9uLWR1cmF0aW9uIixjPXIrInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIixoPXIrInRyYW5zaXRpb24tZGVsYXkiLHA9InRyYW5zaXRpb25lbmQiLGQ9Im9uIituLnRvTG93ZXJDYXNlKCkrInRyYW5zaXRpb25lbmQiLHA9Z1tuXXx8cCx5LmZ4PXt9LHkudG9nZ2xlcz17fSx5Ll9oYXNFbmQ9e30seS5fcmVLZXl3b3Jkcz0vXig/Om5vZGV8ZHVyYXRpb258aXRlcmF0aW9uc3xlYXNpbmd8ZGVsYXl8b258b25zdGFydHxvbmVuZCkkL2ksZS5Ob2RlLkRPTV9FVkVOVFNbcF09MSx5Lk5BTUU9InRyYW5zaXRpb24iLHkuREVGQVVMVF9FQVNJTkc9ImVhc2UiLHkuREVGQVVMVF9EVVJBVElPTj0uNSx5LkRFRkFVTFRfREVMQVk9MCx5Ll9ub2RlQXR0cnM9e30seS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnksaW5pdDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIG4uX25vZGU9ZSwhbi5fcnVubmluZyYmdCYmKG4uX2NvbmZpZz10LGUuX3RyYW5zaXRpb249bixuLl9kdXJhdGlvbj0iZHVyYXRpb24iaW4gdD90LmR1cmF0aW9uOm4uY29uc3RydWN0b3IuREVGQVVMVF9EVVJBVElPTixuLl9kZWxheT0iZGVsYXkiaW4gdD90LmRlbGF5Om4uY29uc3RydWN0b3IuREVGQVVMVF9ERUxBWSxuLl9lYXNpbmc9dC5lYXNpbmd8fG4uY29uc3RydWN0b3IuREVGQVVMVF9FQVNJTkcsbi5fY291bnQ9MCxuLl9ydW5uaW5nPSExKSxufSxhZGRQcm9wZXJ0eTpmdW5jdGlvbih0LG4pe3ZhciByPXRoaXMsaT10aGlzLl9ub2RlLHM9ZS5zdGFtcChpKSxvPWUub25lKGkpLHU9eS5fbm9kZUF0dHJzW3NdLGEsZixsLGMsaDt1fHwodT15Ll9ub2RlQXR0cnNbc109e30pLGM9dVt0XSxuJiZuLnZhbHVlIT09dW5kZWZpbmVkP2g9bi52YWx1ZTpuIT09dW5kZWZpbmVkJiYoaD1uLG49diksdHlwZW9mIGg9PSJmdW5jdGlvbiImJihoPWguY2FsbChvLG8pKSxjJiZjLnRyYW5zaXRpb24mJmMudHJhbnNpdGlvbiE9PXImJmMudHJhbnNpdGlvbi5fY291bnQtLSxyLl9jb3VudCsrLGw9KHR5cGVvZiBuLmR1cmF0aW9uIT0idW5kZWZpbmVkIj9uLmR1cmF0aW9uOnIuX2R1cmF0aW9uKXx8MWUtNCx1W3RdPXt2YWx1ZTpoLGR1cmF0aW9uOmwsZGVsYXk6dHlwZW9mIG4uZGVsYXkhPSJ1bmRlZmluZWQiP24uZGVsYXk6ci5fZGVsYXksZWFzaW5nOm4uZWFzaW5nfHxyLl9lYXNpbmcsdHJhbnNpdGlvbjpyfSxhPWUuRE9NLmdldENvbXB1dGVkU3R5bGUoaSx0KSxmPXR5cGVvZiBoPT0ic3RyaW5nIj9hOnBhcnNlRmxvYXQoYSkseS51c2VOYXRpdmUmJmY9PT1oJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5fb25OYXRpdmVFbmQuY2FsbChpLHtwcm9wZXJ0eU5hbWU6dCxlbGFwc2VkVGltZTpsfSl9LGwqMWUzKX0scmVtb3ZlUHJvcGVydHk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPXkuX25vZGVBdHRyc1tlLnN0YW1wKG4uX25vZGUpXTtyJiZyW3RdJiYoZGVsZXRlIHJbdF0sbi5fY291bnQtLSl9LGluaXRBdHRyczpmdW5jdGlvbih0KXt2YXIgbixyPXRoaXMuX25vZGU7dC50cmFuc2Zvcm0mJiF0W3kuX1RSQU5TRk9STV0mJih0W3kuX1RSQU5TRk9STV09dC50cmFuc2Zvcm0sZGVsZXRlIHQudHJhbnNmb3JtKTtmb3IobiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJiF5Ll9yZUtleXdvcmRzLnRlc3QobikmJih0aGlzLmFkZFByb3BlcnR5KG4sdFtuXSksci5zdHlsZVtuXT09PSIiJiZlLkRPTS5zZXRTdHlsZShyLG4sZS5ET00uZ2V0Q29tcHV0ZWRTdHlsZShyLG4pKSl9LHJ1bjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9bi5fbm9kZSxpPW4uX2NvbmZpZyxzPXt0eXBlOiJ0cmFuc2l0aW9uOnN0YXJ0Iixjb25maWc6aX07cmV0dXJuIG4uX3J1bm5pbmd8fChuLl9ydW5uaW5nPSEwLGkub24mJmkub24uc3RhcnQmJmkub24uc3RhcnQuY2FsbChlLm9uZShyKSxzKSxuLmluaXRBdHRycyhuLl9jb25maWcpLG4uX2NhbGxiYWNrPXQsbi5fc3RhcnQoKSksbn0sX3N0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcnVuTmF0aXZlKCl9LF9wcmVwRHVyOmZ1bmN0aW9uKGUpe3JldHVybiBlPXBhcnNlRmxvYXQoZSkqMWUzLGUrIm1zIn0sX3J1bk5hdGl2ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj10Ll9ub2RlLHI9ZS5zdGFtcChuKSxpPW4uc3R5bGUscz1uLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShuKSxvPXkuX25vZGVBdHRyc1tyXSx1PSIiLGE9c1t5Ll90b0NhbWVsKGYpXSxkPWYrIjogIix2PWwrIjogIixtPWMrIjogIixnPWgrIjogIixiLHcsRTthIT09ImFsbCImJihkKz1hKyIsIix2Kz1zW3kuX3RvQ2FtZWwobCldKyIsIixtKz1zW3kuX3RvQ2FtZWwoYyldKyIsIixnKz1zW3kuX3RvQ2FtZWwoaCldKyIsIik7Zm9yKEUgaW4gbyliPXkuX3RvSHlwaGVuKEUpLHc9b1tFXSwodz1vW0VdKSYmdy50cmFuc2l0aW9uPT09dCYmKEUgaW4gbi5zdHlsZT8odis9dC5fcHJlcER1cih3LmR1cmF0aW9uKSsiLCIsZys9dC5fcHJlcER1cih3LmRlbGF5KSsiLCIsbSs9dy5lYXNpbmcrIiwiLGQrPWIrIiwiLHUrPWIrIjogIit3LnZhbHVlKyI7ICIpOnRoaXMucmVtb3ZlUHJvcGVydHkoRSkpO2Q9ZC5yZXBsYWNlKC8sJC8sIjsiKSx2PXYucmVwbGFjZSgvLCQvLCI7IiksbT1tLnJlcGxhY2UoLywkLywiOyIpLGc9Zy5yZXBsYWNlKC8sJC8sIjsiKSx5Ll9oYXNFbmRbcl18fChuLmFkZEV2ZW50TGlzdGVuZXIocCx0Ll9vbk5hdGl2ZUVuZCwiIikseS5faGFzRW5kW3JdPSEwKSxpLmNzc1RleHQrPWQrdittK2crdX0sX2VuZDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9bi5fbm9kZSxpPW4uX2NhbGxiYWNrLHM9bi5fY29uZmlnLG89e3R5cGU6InRyYW5zaXRpb246ZW5kIixjb25maWc6cyxlbGFwc2VkVGltZTp0fSx1PWUub25lKHIpO24uX3J1bm5pbmc9ITEsbi5fY2FsbGJhY2s9bnVsbCxyJiYocy5vbiYmcy5vbi5lbmQ/c2V0VGltZW91dChmdW5jdGlvbigpe3Mub24uZW5kLmNhbGwodSxvKSxpJiZpLmNhbGwodSxvKX0sMSk6aSYmc2V0VGltZW91dChmdW5jdGlvbigpe2kuY2FsbCh1LG8pfSwxKSl9LF9lbmROYXRpdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbm9kZSxuPXQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsIiIpW3kuX3RvQ2FtZWwoZildO2U9eS5fdG9IeXBoZW4oZSksdHlwZW9mIG49PSJzdHJpbmciJiYobj1uLnJlcGxhY2UobmV3IFJlZ0V4cCgiKD86XnwsXFxzKSIrZSsiLD8iKSwiLCIpLG49bi5yZXBsYWNlKC9eLHwsJC8sIiIpLHQuc3R5bGVbdV09bil9LF9vbk5hdGl2ZUVuZDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9ZS5zdGFtcChuKSxpPXQscz15Ll90b0NhbWVsKGkucHJvcGVydHlOYW1lKSxvPWkuZWxhcHNlZFRpbWUsdT15Ll9ub2RlQXR0cnNbcl0sZj11W3NdLGw9Zj9mLnRyYW5zaXRpb246bnVsbCxjLGg7bCYmKGwucmVtb3ZlUHJvcGVydHkocyksbC5fZW5kTmF0aXZlKHMpLGg9bC5fY29uZmlnW3NdLGM9e3R5cGU6InByb3BlcnR5RW5kIixwcm9wZXJ0eU5hbWU6cyxlbGFwc2VkVGltZTpvLGNvbmZpZzpofSxoJiZoLm9uJiZoLm9uLmVuZCYmaC5vbi5lbmQuY2FsbChlLm9uZShuKSxjKSxsLl9jb3VudDw9MCYmKGwuX2VuZChvKSxuLnN0eWxlW2FdPSIiKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS5fbm9kZTt0JiYodC5yZW1vdmVFdmVudExpc3RlbmVyKHAsZS5fb25OYXRpdmVFbmQsITEpLGUuX25vZGU9bnVsbCl9fSxlLlRyYW5zaXRpb249eSxlLlRyYW5zaXRpb25OYXRpdmU9eSxlLk5vZGUucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXkuX25vZGVBdHRyc1tlLnN0YW1wKHRoaXMuX25vZGUpXSxzPWk/aS50cmFuc2l0aW9ufHxudWxsOm51bGwsbyx1O2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7dHlwZW9mIG49PSJmdW5jdGlvbiImJihyPW4sbj1udWxsKSxvPXkuZnhbdF07aWYobiYmdHlwZW9mIG49PSJvYmplY3QiKXtuPWUuY2xvbmUobik7Zm9yKHUgaW4gbylvLmhhc093blByb3BlcnR5KHUpJiYodSBpbiBufHwoblt1XT1vW3VdKSl9ZWxzZSBuPW99ZWxzZSByPW4sbj10O3JldHVybiBzJiYhcy5fcnVubmluZz9zLmluaXQodGhpcyxuKTpzPW5ldyB5KHRoaXMuX25vZGUsbikscy5ydW4ociksdGhpc30sZS5Ob2RlLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5fc2hvdygpLHQmJmUuVHJhbnNpdGlvbiYmKHR5cGVvZiB0IT0ic3RyaW5nIiYmIXQucHVzaCYmKHR5cGVvZiBuPT0iZnVuY3Rpb24iJiYocj1uLG49dCksdD15LlNIT1dfVFJBTlNJVElPTiksdGhpcy50cmFuc2l0aW9uKHQsbixyKSksdGhpc30sZS5Ob2RlTGlzdC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5fbm9kZXMscz0wLG87d2hpbGUobz1pW3MrK10pZS5vbmUobykuc2hvdyh0LG4scik7cmV0dXJuIHRoaXN9O3ZhciBiPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0JiZ0LmNhbGwoZSksbiYmdHlwZW9mIG49PSJmdW5jdGlvbiImJm4uYXBwbHkoZS5fbm9kZSxhcmd1bWVudHMpfX07ZS5Ob2RlLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdCYmZS5UcmFuc2l0aW9uPyh0eXBlb2Ygbj09ImZ1bmN0aW9uIiYmKHI9bixuPW51bGwpLHI9Yih0aGlzLHRoaXMuX2hpZGUsciksdHlwZW9mIHQhPSJzdHJpbmciJiYhdC5wdXNoJiYodHlwZW9mIG49PSJmdW5jdGlvbiImJihyPW4sbj10KSx0PXkuSElERV9UUkFOU0lUSU9OKSx0aGlzLnRyYW5zaXRpb24odCxuLHIpKTp0aGlzLl9oaWRlKCksdGhpc30sZS5Ob2RlTGlzdC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5fbm9kZXMscz0wLG87d2hpbGUobz1pW3MrK10pZS5vbmUobykuaGlkZSh0LG4scik7cmV0dXJuIHRoaXN9LGUuTm9kZUxpc3QucHJvdG90eXBlCi50cmFuc2l0aW9uPWZ1bmN0aW9uKHQsbixyKXt2YXIgaT10aGlzLl9ub2RlcyxzPXRoaXMuc2l6ZSgpLG89MCxyPXI9PT0hMCx1O3doaWxlKHU9aVtvKytdKW88cyYmcj9lLm9uZSh1KS50cmFuc2l0aW9uKHQpOmUub25lKHUpLnRyYW5zaXRpb24odCxuKTtyZXR1cm4gdGhpc30sZS5Ob2RlLnByb3RvdHlwZS50b2dnbGVWaWV3PWZ1bmN0aW9uKHQsbixyKXt0aGlzLl90b2dnbGVzPXRoaXMuX3RvZ2dsZXN8fFtdLHI9YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV07aWYodHlwZW9mIHQhPSJzdHJpbmciKXtuPXQsdGhpcy5fdG9nZ2xlVmlldyhuLHIpO3JldHVybn1yZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiImJihuPXVuZGVmaW5lZCksdHlwZW9mIG49PSJ1bmRlZmluZWQiJiZ0IGluIHRoaXMuX3RvZ2dsZXMmJihuPSF0aGlzLl90b2dnbGVzW3RdKSxuPW4/MTowLG4/dGhpcy5fc2hvdygpOnI9Yih0aGlzLHRoaXMuX2hpZGUsciksdGhpcy5fdG9nZ2xlc1t0XT1uLHRoaXMudHJhbnNpdGlvbihlLlRyYW5zaXRpb24udG9nZ2xlc1t0XVtuXSxyKSx0aGlzfSxlLk5vZGVMaXN0LnByb3RvdHlwZS50b2dnbGVWaWV3PWZ1bmN0aW9uKHQsbixyKXt2YXIgaT10aGlzLl9ub2RlcyxzPTAsbzt3aGlsZShvPWlbcysrXSlvPWUub25lKG8pLG8udG9nZ2xlVmlldy5hcHBseShvLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGUubWl4KHkuZngse2ZhZGVPdXQ6e29wYWNpdHk6MCxkdXJhdGlvbjouNSxlYXNpbmc6ImVhc2Utb3V0In0sZmFkZUluOntvcGFjaXR5OjEsZHVyYXRpb246LjUsZWFzaW5nOiJlYXNlLWluIn0sc2l6ZU91dDp7aGVpZ2h0OjAsd2lkdGg6MCxkdXJhdGlvbjouNzUsZWFzaW5nOiJlYXNlLW91dCJ9LHNpemVJbjp7aGVpZ2h0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgic2Nyb2xsSGVpZ2h0IikrInB4In0sd2lkdGg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJzY3JvbGxXaWR0aCIpKyJweCJ9LGR1cmF0aW9uOi41LGVhc2luZzoiZWFzZS1pbiIsb246e3N0YXJ0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTdHlsZSgib3ZlcmZsb3ciKTtlIT09ImhpZGRlbiImJih0aGlzLnNldFN0eWxlKCJvdmVyZmxvdyIsImhpZGRlbiIpLHRoaXMuX3RyYW5zaXRpb25PdmVyZmxvdz1lKX0sZW5kOmZ1bmN0aW9uKCl7dGhpcy5fdHJhbnNpdGlvbk92ZXJmbG93JiYodGhpcy5zZXRTdHlsZSgib3ZlcmZsb3ciLHRoaXMuX3RyYW5zaXRpb25PdmVyZmxvdyksZGVsZXRlIHRoaXMuX3RyYW5zaXRpb25PdmVyZmxvdyl9fX19KSxlLm1peCh5LnRvZ2dsZXMse3NpemU6WyJzaXplT3V0Iiwic2l6ZUluIl0sZmFkZTpbImZhZGVPdXQiLCJmYWRlSW4iXX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJub2RlLXN0eWxlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInNlbGVjdG9yLWNzczIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49InBhcmVudE5vZGUiLHI9InRhZ05hbWUiLGk9ImF0dHJpYnV0ZXMiLHM9ImNvbWJpbmF0b3IiLG89InBzZXVkb3MiLHU9ZS5TZWxlY3RvcixhPXtfcmVSZWdFeHBUb2tlbnM6LyhbXF5cJFw/XFtcXVwqXCtcLVwuXChcKVx8XFxdKS8sU09SVF9SRVNVTFRTOiEwLF9pc1hNTDpmdW5jdGlvbigpe3ZhciB0PWUuY29uZmlnLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKS50YWdOYW1lIT09IkRJViI7cmV0dXJuIHR9KCksc2hvcnRoYW5kOnsiXFwjKC0/W19hLXowLTldK1stXFx3XFx1RTAwMF0qKSI6IltpZD0kMV0iLCJcXC4oLT9bX2Etel0rWy1cXHdcXHVFMDAwXSopIjoiW2NsYXNzTmFtZX49JDFdIn0sb3BlcmF0b3JzOnsiIjpmdW5jdGlvbih0LG4pe3JldHVybiBlLkRPTS5nZXRBdHRyaWJ1dGUodCxuKSE9PSIifSwifj0iOiIoPzpefFxccyspe3ZhbH0oPzpcXHMrfCQpIiwifD0iOiJee3ZhbH0tPyJ9LHBzZXVkb3M6eyJmaXJzdC1jaGlsZCI6ZnVuY3Rpb24odCl7cmV0dXJuIGUuRE9NLl9jaGlsZHJlbih0W25dKVswXT09PXR9fSxfYnJ1dGVRdWVyeTpmdW5jdGlvbih0LG4scil7dmFyIGk9W10scz1bXSxvLGE9dS5fdG9rZW5pemUodCksZj1hW2EubGVuZ3RoLTFdLGw9ZS5ET00uX2dldERvYyhuKSxjLGgscCxkLHY7aWYoZil7aD1mLmlkLHA9Zi5jbGFzc05hbWUsZD1mLnRhZ05hbWV8fCIqIjtpZihuLmdldEVsZW1lbnRzQnlUYWdOYW1lKWgmJihuLmFsbHx8bi5ub2RlVHlwZT09PTl8fGUuRE9NLmluRG9jKG4pKT9zPWUuRE9NLmFsbEJ5SWQoaCxuKTpwP3M9bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHApOnM9bi5nZXRFbGVtZW50c0J5VGFnTmFtZShkKTtlbHNle289W10sYz1uLmZpcnN0Q2hpbGQsdj1kPT09IioiO3doaWxlKGMpe3doaWxlKGMpYy50YWdOYW1lPiJAIiYmKHZ8fGMudGFnTmFtZT09PWQpJiZzLnB1c2goYyksby5wdXNoKGMpLGM9Yy5maXJzdENoaWxkO3doaWxlKG8ubGVuZ3RoPjAmJiFjKWM9by5wb3AoKS5uZXh0U2libGluZ319cy5sZW5ndGgmJihpPXUuX2ZpbHRlck5vZGVzKHMsYSxyKSl9cmV0dXJuIGl9LF9maWx0ZXJOb2RlczpmdW5jdGlvbih0LG4scil7dmFyIGk9MCxzLG89bi5sZW5ndGgsYT1vLTEsZj1bXSxsPXRbMF0sYz1sLGg9ZS5TZWxlY3Rvci5nZXR0ZXJzLHAsZCx2LG0sZyx5LGIsdztmb3IoaT0wO2M9bD10W2krK107KXthPW8tMSxtPW51bGw7ZTp3aGlsZShjJiZjLnRhZ05hbWUpe3Y9blthXSxiPXYudGVzdHMscz1iLmxlbmd0aDtpZihzJiYhZyl3aGlsZSh3PWJbLS1zXSl7cD13WzFdLGhbd1swXV0/eT1oW3dbMF1dKGMsd1swXSk6KHk9Y1t3WzBdXSx3WzBdPT09InRhZ05hbWUiJiYhdS5faXNYTUwmJih5PXkudG9VcHBlckNhc2UoKSksdHlwZW9mIHkhPSJzdHJpbmciJiZ5IT09dW5kZWZpbmVkJiZ5LnRvU3RyaW5nP3k9eS50b1N0cmluZygpOnk9PT11bmRlZmluZWQmJmMuZ2V0QXR0cmlidXRlJiYoeT1jLmdldEF0dHJpYnV0ZSh3WzBdLDIpKSk7aWYocD09PSI9IiYmeSE9PXdbMl18fHR5cGVvZiBwIT0ic3RyaW5nIiYmcC50ZXN0JiYhcC50ZXN0KHkpfHwhcC50ZXN0JiZ0eXBlb2YgcD09ImZ1bmN0aW9uIiYmIXAoYyx3WzBdLHdbMl0pKXtpZihjPWNbbV0pd2hpbGUoYyYmKCFjLnRhZ05hbWV8fHYudGFnTmFtZSYmdi50YWdOYW1lIT09Yy50YWdOYW1lKSljPWNbbV07Y29udGludWUgZX19YS0tO2lmKCEhZ3x8IShkPXYuY29tYmluYXRvcikpe2YucHVzaChsKTtpZihyKXJldHVybiBmO2JyZWFrfW09ZC5heGlzLGM9Y1ttXTt3aGlsZShjJiYhYy50YWdOYW1lKWM9Y1ttXTtkLmRpcmVjdCYmKG09bnVsbCl9fXJldHVybiBsPWM9bnVsbCxmfSxjb21iaW5hdG9yczp7IiAiOntheGlzOiJwYXJlbnROb2RlIn0sIj4iOntheGlzOiJwYXJlbnROb2RlIixkaXJlY3Q6ITB9LCIrIjp7YXhpczoicHJldmlvdXNTaWJsaW5nIixkaXJlY3Q6ITB9fSxfcGFyc2Vyczpbe25hbWU6aSxyZTovXlx1RTAwMygtP1thLXpdK1tcd1wtXSopKyhbflx8XF5cJFwqIT1dPT8pP1snIl0/KFteXHVFMDA0JyJdKilbJyJdP1x1RTAwNC9pLGZuOmZ1bmN0aW9uKHQsbil7dmFyIHI9dFsyXXx8IiIsaT11Lm9wZXJhdG9ycyxzPXRbM10/dFszXS5yZXBsYWNlKC9cXC9nLCIiKToiIixvO2lmKHRbMV09PT0iaWQiJiZyPT09Ij0ifHx0WzFdPT09ImNsYXNzTmFtZSImJmUuY29uZmlnLmRvYy5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmKHI9PT0ifj0ifHxyPT09Ij0iKSluLnByZWZpbHRlcj10WzFdLHRbM109cyxuW3RbMV1dPXRbMV09PT0iaWQiP3RbM106cztyIGluIGkmJihvPWlbcl0sdHlwZW9mIG89PSJzdHJpbmciJiYodFszXT1zLnJlcGxhY2UodS5fcmVSZWdFeHBUb2tlbnMsIlxcJDEiKSxvPW5ldyBSZWdFeHAoby5yZXBsYWNlKCJ7dmFsfSIsdFszXSkpKSx0WzJdPW8pO2lmKCFuLmxhc3R8fG4ucHJlZmlsdGVyIT09dFsxXSlyZXR1cm4gdC5zbGljZSgxKX19LHtuYW1lOnIscmU6L14oKD86LT9bX2Etel0rW1x3LV0qKXxcKikvaSxmbjpmdW5jdGlvbihlLHQpe3ZhciBuPWVbMV07dS5faXNYTUx8fChuPW4udG9VcHBlckNhc2UoKSksdC50YWdOYW1lPW47aWYobiE9PSIqIiYmKCF0Lmxhc3R8fHQucHJlZmlsdGVyKSlyZXR1cm5bciwiPSIsbl07dC5wcmVmaWx0ZXJ8fCh0LnByZWZpbHRlcj0idGFnTmFtZSIpfX0se25hbWU6cyxyZTovXlxzKihbPit+XXxccylccyovLGZuOmZ1bmN0aW9uKGUsdCl7fX0se25hbWU6byxyZTovXjooW1wtXHddKykoPzpcdUUwMDVbJyJdPyhbXlx1RTAwNV0qKVsnIl0/XHVFMDA2KSovaSxmbjpmdW5jdGlvbihlLHQpe3ZhciBuPXVbb11bZVsxXV07cmV0dXJuIG4/KGVbMl0mJihlWzJdPWVbMl0ucmVwbGFjZSgvXFwvZywiIikpLFtlWzJdLG5dKTohMX19XSxfZ2V0VG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJue3RhZ05hbWU6bnVsbCxpZDpudWxsLGNsYXNzTmFtZTpudWxsLGF0dHJpYnV0ZXM6e30sY29tYmluYXRvcjpudWxsLHRlc3RzOltdfX0sX3Rva2VuaXplOmZ1bmN0aW9uKHQpe3Q9dHx8IiIsdD11Ll9wYXJzZVNlbGVjdG9yKGUuTGFuZy50cmltKHQpKTt2YXIgbj11Ll9nZXRUb2tlbigpLHI9dCxpPVtdLG89ITEsYSxmLGwsYztlOmRve289ITE7Zm9yKGw9MDtjPXUuX3BhcnNlcnNbbCsrXTspaWYoYT1jLnJlLmV4ZWModCkpe2MubmFtZSE9PXMmJihuLnNlbGVjdG9yPXQpLHQ9dC5yZXBsYWNlKGFbMF0sIiIpLHQubGVuZ3RofHwobi5sYXN0PSEwKSx1Ll9hdHRyRmlsdGVyc1thWzFdXSYmKGFbMV09dS5fYXR0ckZpbHRlcnNbYVsxXV0pLGY9Yy5mbihhLG4pO2lmKGY9PT0hMSl7bz0hMTticmVhayBlfWYmJm4udGVzdHMucHVzaChmKTtpZighdC5sZW5ndGh8fGMubmFtZT09PXMpaS5wdXNoKG4pLG49dS5fZ2V0VG9rZW4obiksYy5uYW1lPT09cyYmKG4uY29tYmluYXRvcj1lLlNlbGVjdG9yLmNvbWJpbmF0b3JzW2FbMV1dKTtvPSEwfX13aGlsZShvJiZ0Lmxlbmd0aCk7aWYoIW98fHQubGVuZ3RoKWk9W107cmV0dXJuIGl9LF9yZXBsYWNlTWFya2VyczpmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoL1xbL2csIlx1ZTAwMyIpLGU9ZS5yZXBsYWNlKC9cXS9nLCJcdWUwMDQiKSxlPWUucmVwbGFjZSgvXCgvZywiXHVlMDA1IiksZT1lLnJlcGxhY2UoL1wpL2csIlx1ZTAwNiIpLGV9LF9yZXBsYWNlU2hvcnRoYW5kOmZ1bmN0aW9uKHQpe3ZhciBuPWUuU2VsZWN0b3Iuc2hvcnRoYW5kLHI7Zm9yKHIgaW4gbiluLmhhc093blByb3BlcnR5KHIpJiYodD10LnJlcGxhY2UobmV3IFJlZ0V4cChyLCJnaSIpLG5bcl0pKTtyZXR1cm4gdH0sX3BhcnNlU2VsZWN0b3I6ZnVuY3Rpb24odCl7dmFyIG49ZS5TZWxlY3Rvci5fcmVwbGFjZVNlbGVjdG9yKHQpLHQ9bi5zZWxlY3RvcjtyZXR1cm4gdD1lLlNlbGVjdG9yLl9yZXBsYWNlU2hvcnRoYW5kKHQpLHQ9ZS5TZWxlY3Rvci5fcmVzdG9yZSgiYXR0ciIsdCxuLmF0dHJzKSx0PWUuU2VsZWN0b3IuX3Jlc3RvcmUoInBzZXVkbyIsdCxuLnBzZXVkb3MpLHQ9ZS5TZWxlY3Rvci5fcmVwbGFjZU1hcmtlcnModCksdD1lLlNlbGVjdG9yLl9yZXN0b3JlKCJlc2MiLHQsbi5lc2MpLHR9LF9hdHRyRmlsdGVyczp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGdldHRlcnM6e2hyZWY6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5ET00uZ2V0QXR0cmlidXRlKHQsbil9LGlkOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuRE9NLmdldElkKHQpfX19O2UubWl4KGUuU2VsZWN0b3IsYSwhMCksZS5TZWxlY3Rvci5nZXR0ZXJzLnNyYz1lLlNlbGVjdG9yLmdldHRlcnMucmVsPWUuU2VsZWN0b3IuZ2V0dGVycy5ocmVmLGUuU2VsZWN0b3IudXNlTmF0aXZlJiZlLmNvbmZpZy5kb2MucXVlcnlTZWxlY3RvciYmKGUuU2VsZWN0b3Iuc2hvcnRoYW5kWyJcXC4oLT9bX2Etel0rWy1cXHddKikiXT0iW2NsYXNzfj0kMV0iKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsic2VsZWN0b3ItbmF0aXZlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInNlbGVjdG9yLWNzczMiLGZ1bmN0aW9uKGUsdCl7ZS5TZWxlY3Rvci5fcmVOdGg9L14oPzooW1wtXT9cZCopKG4pezF9fChvZGR8ZXZlbikkKSooW1wtK10/XGQqKSQvLGUuU2VsZWN0b3IuX2dldE50aD1mdW5jdGlvbih0LG4scixpKXtlLlNlbGVjdG9yLl9yZU50aC50ZXN0KG4pO3ZhciBzPXBhcnNlSW50KFJlZ0V4cC4kMSwxMCksbz1SZWdFeHAuJDIsdT1SZWdFeHAuJDMsYT1wYXJzZUludChSZWdFeHAuJDQsMTApfHwwLGY9W10sbD1lLkRPTS5fY2hpbGRyZW4odC5wYXJlbnROb2RlLHIpLGM7dT8ocz0yLGM9IisiLG89Im4iLGE9dT09PSJvZGQiPzE6MCk6aXNOYU4ocykmJihzPW8/MTowKTtpZihzPT09MClyZXR1cm4gaSYmKGE9bC5sZW5ndGgtYSsxKSxsW2EtMV09PT10PyEwOiExO3M8MCYmKGk9ISFpLHM9TWF0aC5hYnMocykpO2lmKCFpKXtmb3IodmFyIGg9YS0xLHA9bC5sZW5ndGg7aDxwO2grPXMpaWYoaD49MCYmbFtoXT09PXQpcmV0dXJuITB9ZWxzZSBmb3IodmFyIGg9bC5sZW5ndGgtYSxwPWwubGVuZ3RoO2g+PTA7aC09cylpZihoPHAmJmxbaF09PT10KXJldHVybiEwO3JldHVybiExfSxlLm1peChlLlNlbGVjdG9yLnBzZXVkb3Mse3Jvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1lLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fSwibnRoLWNoaWxkIjpmdW5jdGlvbih0LG4pe3JldHVybiBlLlNlbGVjdG9yLl9nZXROdGgodCxuKX0sIm50aC1sYXN0LWNoaWxkIjpmdW5jdGlvbih0LG4pe3JldHVybiBlLlNlbGVjdG9yLl9nZXROdGgodCxuLG51bGwsITApfSwibnRoLW9mLXR5cGUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuU2VsZWN0b3IuX2dldE50aCh0LG4sdC50YWdOYW1lKX0sIm50aC1sYXN0LW9mLXR5cGUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuU2VsZWN0b3IuX2dldE50aCh0LG4sdC50YWdOYW1lLCEwKX0sImxhc3QtY2hpbGQiOmZ1bmN0aW9uKHQpe3ZhciBuPWUuRE9NLl9jaGlsZHJlbih0LnBhcmVudE5vZGUpO3JldHVybiBuW24ubGVuZ3RoLTFdPT09dH0sImZpcnN0LW9mLXR5cGUiOmZ1bmN0aW9uKHQpe3JldHVybiBlLkRPTS5fY2hpbGRyZW4odC5wYXJlbnROb2RlLHQudGFnTmFtZSlbMF09PT10fSwibGFzdC1vZi10eXBlIjpmdW5jdGlvbih0KXt2YXIgbj1lLkRPTS5fY2hpbGRyZW4odC5wYXJlbnROb2RlLHQudGFnTmFtZSk7cmV0dXJuIG5bbi5sZW5ndGgtMV09PT10fSwib25seS1jaGlsZCI6ZnVuY3Rpb24odCl7dmFyIG49ZS5ET00uX2NoaWxkcmVuKHQucGFyZW50Tm9kZSk7cmV0dXJuIG4ubGVuZ3RoPT09MSYmblswXT09PXR9LCJvbmx5LW9mLXR5cGUiOmZ1bmN0aW9uKHQpe3ZhciBuPWUuRE9NLl9jaGlsZHJlbih0LnBhcmVudE5vZGUsdC50YWdOYW1lKTtyZXR1cm4gbi5sZW5ndGg9PT0xJiZuWzBdPT09dH0sZW1wdHk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hpbGROb2Rlcy5sZW5ndGg9PT0wfSxub3Q6ZnVuY3Rpb24odCxuKXtyZXR1cm4hZS5TZWxlY3Rvci50ZXN0KHQsbil9LGNvbnRhaW5zOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbm5lclRleHR8fGUudGV4dENvbnRlbnR8fCIiO3JldHVybiBuLmluZGV4T2YodCk+LTF9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hlY2tlZD09PSEwfHxlLnNlbGVjdGVkPT09ITB9LGVuYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQhPT11bmRlZmluZWQmJiFlLmRpc2FibGVkfSxkaXNhYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZH19KSxlLm1peChlLlNlbGVjdG9yLm9wZXJhdG9ycyx7Il49IjoiXnt2YWx9IiwiJD0iOiJ7dmFsfSQiLCIqPSI6Int2YWx9In0pLGUuU2VsZWN0b3IuY29tYmluYXRvcnNbIn4iXT17YXhpczoicHJldmlvdXNTaWJsaW5nIn19LCIzLjE3LjIiLHtyZXF1aXJlczpbInNlbGVjdG9yLW5hdGl2ZSIsInNlbGVjdG9yLWNzczIiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiZG9tLXN0eWxlLWllIixmdW5jdGlvbihlLHQpe3ZhciBuPSJoYXNMYXlvdXQiLHI9InB4IixpPSJmaWx0ZXIiLHM9ImZpbHRlcnMiLG89Im9wYWNpdHkiLHU9ImF1dG8iLGE9ImJvcmRlcldpZHRoIixmPSJib3JkZXJUb3BXaWR0aCIsbD0iYm9yZGVyUmlnaHRXaWR0aCIsYz0iYm9yZGVyQm90dG9tV2lkdGgiLGg9ImJvcmRlckxlZnRXaWR0aCIscD0id2lkdGgiLGQ9ImhlaWdodCIsdj0idHJhbnNwYXJlbnQiLG09InZpc2libGUiLGc9ImdldENvbXB1dGVkU3R5bGUiLHk9ZS5jb25maWcuZG9jLmRvY3VtZW50RWxlbWVudCxiPWUuRmVhdHVyZXMudGVzdCx3PWUuRmVhdHVyZXMuYWRkLEU9L14oXGRbLlxkXSopKyhlbXxleHxweHxnZHxyZW18dnd8dmh8dm18Y2h8bW18Y218aW58cHR8cGN8ZGVnfHJhZHxtc3xzfGh6fGtoenwlKXsxfT8vaSxTPWUuVUEuaWU+PTgseD1mdW5jdGlvbihlKXtyZXR1cm4gZS5jdXJyZW50U3R5bGV8fGUuc3R5bGV9LFQ9e0NVU1RPTV9TVFlMRVM6e30sZ2V0OmZ1bmN0aW9uKHQsbil7dmFyIGk9IiIscztyZXR1cm4gdCYmKHM9eCh0KVtuXSxuPT09byYmZS5ET00uQ1VTVE9NX1NUWUxFU1tvXT9pPWUuRE9NLkNVU1RPTV9TVFlMRVNbb10uZ2V0KHQpOiFzfHxzLmluZGV4T2YmJnMuaW5kZXhPZihyKT4tMT9pPXM6ZS5ET00uSUUuQ09NUFVURURbbl0/aT1lLkRPTS5JRS5DT01QVVRFRFtuXSh0LG4pOkUudGVzdChzKT9pPVQuZ2V0UGl4ZWwodCxuKStyOmk9cyksaX0sc2l6ZU9mZnNldHM6e3dpZHRoOlsiTGVmdCIsIlJpZ2h0Il0saGVpZ2h0OlsiVG9wIiwiQm90dG9tIl0sdG9wOlsiVG9wIl0sYm90dG9tOlsiQm90dG9tIl19LGdldE9mZnNldDpmdW5jdGlvbihlLHQpe3ZhciBuPXgoZSlbdF0saT10LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpLHM9InBpeGVsIitpLG89VC5zaXplT2Zmc2V0c1t0XSxhPWUub3duZXJEb2N1bWVudC5jb21wYXRNb2RlLGY9IiI7cmV0dXJuIG49PT11fHxuLmluZGV4T2YoIiUiKT4tMT8oZj1lWyJvZmZzZXQiK2ldLGEhPT0iQmFja0NvbXBhdCImJihvWzBdJiYoZi09VC5nZXRQaXhlbChlLCJwYWRkaW5nIitvWzBdKSxmLT1ULmdldEJvcmRlcldpZHRoKGUsImJvcmRlciIrb1swXSsiV2lkdGgiLDEpKSxvWzFdJiYoZi09VC5nZXRQaXhlbChlLCJwYWRkaW5nIitvWzFdKSxmLT1ULmdldEJvcmRlcldpZHRoKGUsImJvcmRlciIrb1sxXSsiV2lkdGgiLDEpKSkpOighZS5zdHlsZVtzXSYmIWUuc3R5bGVbdF0mJihlLnN0eWxlW3RdPW4pLGY9ZS5zdHlsZVtzXSksZityfSxib3JkZXJNYXA6e3RoaW46Uz8iMXB4IjoiMnB4IixtZWRpdW06Uz8iM3B4IjoiNHB4Iix0aGljazpTPyI1cHgiOiI2cHgifSxnZXRCb3JkZXJXaWR0aDpmdW5jdGlvbihlLHQsbil7dmFyIGk9ZS5jdXJyZW50U3R5bGVbdF07cmV0dXJuIGkuaW5kZXhPZihyKTwwJiYoVC5ib3JkZXJNYXBbaV0mJmUuY3VycmVudFN0eWxlLmJvcmRlclN0eWxlIT09Im5vbmUiP2k9VC5ib3JkZXJNYXBbaV06aT0wKSxuP3BhcnNlRmxvYXQoaSk6aX0sZ2V0UGl4ZWw6ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsLHI9eChlKSxpPXIucmlnaHQscz1yW3RdO3JldHVybiBlLnN0eWxlLnJpZ2h0PXMsbj1lLnN0eWxlLnBpeGVsUmlnaHQsZS5zdHlsZS5yaWdodD1pLG59LGdldE1hcmdpbjpmdW5jdGlvbihlLHQpe3ZhciBuLGk9eChlKTtyZXR1cm4gaVt0XT09PXU/bj0wOm49VC5nZXRQaXhlbChlLHQpLG4rcn0sZ2V0VmlzaWJpbGl0eTpmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKChuPWUuY3VycmVudFN0eWxlKSYmblt0XT09PSJpbmhlcml0IillPWUucGFyZW50Tm9kZTtyZXR1cm4gbj9uW3RdOm19LGdldENvbG9yOmZ1bmN0aW9uKHQsbil7dmFyIHI9eCh0KVtuXTtyZXR1cm4oIXJ8fHI9PT12KSYmZS5ET00uZWxlbWVudEJ5QXhpcyh0LCJwYXJlbnROb2RlIixudWxsLGZ1bmN0aW9uKGUpe3I9eChlKVtuXTtpZihyJiZyIT09dilyZXR1cm4gdD1lLCEwfSksZS5Db2xvci50b1JHQihyKX0sZ2V0Qm9yZGVyQ29sb3I6ZnVuY3Rpb24odCxuKXt2YXIgcj14KHQpLGk9cltuXXx8ci5jb2xvcjtyZXR1cm4gZS5Db2xvci50b1JHQihlLkNvbG9yLnRvSGV4KGkpKX19LE49e307dygic3R5bGUiLCJjb21wdXRlZFN0eWxlIix7dGVzdDpmdW5jdGlvbigpe3JldHVybiJnZXRDb21wdXRlZFN0eWxlImluIGUuY29uZmlnLndpbn19KSx3KCJzdHlsZSIsIm9wYWNpdHkiLHt0ZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIm9wYWNpdHkiaW4geS5zdHlsZX19KSx3KCJzdHlsZSIsImZpbHRlciIse3Rlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4iZmlsdGVycyJpbiB5fX0pLCFiKCJzdHlsZSIsIm9wYWNpdHkiKSYmYigic3R5bGUiLCJmaWx0ZXIiKSYmKGUuRE9NLkNVU1RPTV9TVFlMRVNbb109e2dldDpmdW5jdGlvbihlKXt2YXIgdD0xMDA7dHJ5e3Q9ZVtzXVsiRFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEiXVtvXX1jYXRjaChuKXt0cnl7dD1lW3NdKCJhbHBoYSIpW29dfWNhdGNoKHIpe319cmV0dXJuIHQvMTAwfSxzZXQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBzLHU9eChlKSxhPXVbaV07cj1yfHxlLnN0eWxlLHQ9PT0iIiYmKHM9byBpbiB1P3Vbb106MSx0PXMpLHR5cGVvZiBhPT0ic3RyaW5nIiYmKHJbaV09YS5yZXBsYWNlKC9hbHBoYShbXildKlwpKS9naSwiIikrKHQ8PTE/ImFscGhhKCIrbysiPSIrdCoxMDArIikiOiIiKSxyW2ldfHxyLnJlbW92ZUF0dHJpYnV0ZShpKSx1W25dfHwoci56b29tPTEpKX19KTt0cnl7ZS5jb25maWcuZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLmhlaWdodD0iLTFweCJ9Y2F0Y2goQyl7ZS5ET00uQ1VTVE9NX1NUWUxFUy5oZWlnaHQ9e3NldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9cGFyc2VGbG9hdCh0KTtpZihyPj0wfHx0PT09ImF1dG8ifHx0PT09IiIpbi5oZWlnaHQ9dH19LGUuRE9NLkNVU1RPTV9TVFlMRVMud2lkdGg9e3NldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9cGFyc2VGbG9hdCh0KTtpZihyPj0wfHx0PT09ImF1dG8ifHx0PT09IiIpbi53aWR0aD10fX19Yigic3R5bGUiLCJjb21wdXRlZFN0eWxlIil8fChOW3BdPU5bZF09VC5nZXRPZmZzZXQsTi5jb2xvcj1OLmJhY2tncm91bmRDb2xvcj1ULmdldENvbG9yLE5bYV09TltmXT1OW2xdPU5bY109TltoXT1ULmdldEJvcmRlcldpZHRoLE4ubWFyZ2luVG9wPU4ubWFyZ2luUmlnaHQ9Ti5tYXJnaW5Cb3R0b209Ti5tYXJnaW5MZWZ0PVQuZ2V0TWFyZ2luLE4udmlzaWJpbGl0eT1ULmdldFZpc2liaWxpdHksTi5ib3JkZXJDb2xvcj1OLmJvcmRlclRvcENvbG9yPU4uYm9yZGVyUmlnaHRDb2xvcj1OLmJvcmRlckJvdHRvbUNvbG9yPU4uYm9yZGVyTGVmdENvbG9yPVQuZ2V0Qm9yZGVyQ29sb3IsZS5ET01bZ109VC5nZXQsZS5uYW1lc3BhY2UoIkRPTS5JRSIpLGUuRE9NLklFLkNPTVBVVEVEPU4sZS5ET00uSUUuQ29tcHV0ZWRTdHlsZT1UKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZG9tLXN0eWxlIiwiY29sb3ItYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJlc2NhcGUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImI3gyNzsiLCIvIjoiJiN4MkY7IiwiYCI6IiYjeDYwOyJ9LHI9e2h0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UoL1smPD4iJ1wvYF0vZyxyLl9odG1sUmVwbGFjZXIpfSxyZWdleDpmdW5jdGlvbihlKXtyZXR1cm4oZSsiIikucmVwbGFjZSgvW1wtJFxeKigpK1xbXF17fXxcXCwuP1xzXS9nLCJcXCQmIil9LF9odG1sUmVwbGFjZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV19fTtyLnJlZ2V4cD1yLnJlZ2V4LGUuRXNjYXBlPXJ9LCIzLjE3LjIiLHtyZXF1aXJlczpbInl1aS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImF0dHJpYnV0ZS1jb3JlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGIoZSx0LG4pe3RoaXMuX3l1aWV2dD1udWxsLHRoaXMuX2luaXRBdHRySG9zdChlLHQsbil9ZS5TdGF0ZT1mdW5jdGlvbigpe3RoaXMuZGF0YT17fX0sZS5TdGF0ZS5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5kYXRhW2VdO3J8fChyPXRoaXMuZGF0YVtlXT17fSksclt0XT1ufSxhZGRBbGw6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmRhdGFbZV0scjtufHwobj10aGlzLmRhdGFbZV09e30pO2ZvcihyIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09dFtyXSl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZGF0YVtlXTtuJiZkZWxldGUgblt0XX0scmVtb3ZlQWxsOmZ1bmN0aW9uKHQsbil7dmFyIHI7bj9lLmVhY2gobixmdW5jdGlvbihlLG4pe3RoaXMucmVtb3ZlKHQsdHlwZW9mIG49PSJzdHJpbmciP246ZSl9LHRoaXMpOihyPXRoaXMuZGF0YSx0IGluIHImJmRlbGV0ZSByW3RdKX0sZ2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5kYXRhW2VdO2lmKG4pcmV0dXJuIG5bdF19LGdldEFsbDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZGF0YVtlXSxyLGk7aWYodClpPW47ZWxzZSBpZihuKXtpPXt9O2ZvcihyIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShyKSYmKGlbcl09bltyXSl9cmV0dXJuIGl9fTt2YXIgbj1lLk9iamVjdCxyPWUuTGFuZyxpPSIuIixzPSJnZXR0ZXIiLG89InNldHRlciIsdT0icmVhZE9ubHkiLGE9IndyaXRlT25jZSIsZj0iaW5pdE9ubHkiLGw9InZhbGlkYXRvciIsYz0idmFsdWUiLGg9InZhbHVlRm4iLHA9ImxhenlBZGQiLGQ9ImFkZGVkIix2PSJfYnlwYXNzUHJveHkiLG09ImluaXRWYWx1ZSIsZz0ibGF6eSIseTtiLklOVkFMSURfVkFMVUU9e30seT1iLklOVkFMSURfVkFMVUUsYi5fQVRUUl9DRkc9W28scyxsLGMsaCxhLHUscCx2XSxiLnByb3RlY3RBdHRycz1mdW5jdGlvbih0KXtpZih0KXt0PWUubWVyZ2UodCk7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZS5tZXJnZSh0W25dKSl9cmV0dXJuIHR9LGIucHJvdG90eXBlPXtfaW5pdEF0dHJIb3N0OmZ1bmN0aW9uKHQsbixyKXt0aGlzLl9zdGF0ZT1uZXcgZS5TdGF0ZSx0aGlzLl9pbml0QXR0cnModCxuLHIpfSxhZGRBdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLGk9ci5fc3RhdGUscz1pLmRhdGEsbyx1LGE7dD10fHx7fSxwIGluIHQmJihuPXRbcF0pLHU9aS5nZXQoZSxkKTtpZihuJiYhdSlpLmRhdGFbZV09e2xhenk6dCxhZGRlZDohMH07ZWxzZSBpZighdXx8dC5pc0xhenlBZGQpYT1jIGluIHQsYSYmKG89dC52YWx1ZSx0LnZhbHVlPXVuZGVmaW5lZCksdC5hZGRlZD0hMCx0LmluaXRpYWxpemluZz0hMCxzW2VdPXQsYSYmci5zZXQoZSxvKSx0LmluaXRpYWxpemluZz0hMTtyZXR1cm4gcn0sYXR0ckFkZGVkOmZ1bmN0aW9uKGUpe3JldHVybiEhdGhpcy5fc3RhdGUuZ2V0KGUsZCl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZ2V0QXR0cihlKX0sX2lzTGF6eUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3N0YXRlLmdldChlLGcpfSxfYWRkTGF6eUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9zdGF0ZTt0PXR8fG4uZ2V0KGUsZyksdCYmKG4uZGF0YVtlXS5sYXp5PXVuZGVmaW5lZCx0LmlzTGF6eUFkZD0hMCx0aGlzLmFkZEF0dHIoZSx0KSl9LHNldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuX3NldEF0dHIoZSx0LG4pfSxfc2V0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fc2V0QXR0cihlLHQsbiwhMCl9LF9zZXRBdHRyOmZ1bmN0aW9uKHQscixzLG8pe3ZhciB1PSEwLGE9dGhpcy5fc3RhdGUsbD10aGlzLl9zdGF0ZVByb3h5LGM9dGhpcy5fdENmZ3MsaCxwLGQsdixtLGcseTtyZXR1cm4gdC5pbmRleE9mKGkpIT09LTEmJihkPXQsdj10LnNwbGl0KGkpLHQ9di5zaGlmdCgpKSxjJiZjW3RdJiZ0aGlzLl9hZGRPdXRPZk9yZGVyKHQsY1t0XSksaD1hLmRhdGFbdF18fHt9LGgubGF6eSYmKGg9aC5sYXp5LHRoaXMuX2FkZExhenlBdHRyKHQsaCkpLHA9aC52YWx1ZT09PXVuZGVmaW5lZCxsJiZ0IGluIGwmJiFoLl9ieXBhc3NQcm94eSYmKHA9ITEpLGc9aC53cml0ZU9uY2UseT1oLmluaXRpYWxpemluZywhcCYmIW8mJihnJiYodT0hMSksaC5yZWFkT25seSYmKHU9ITEpKSwheSYmIW8mJmc9PT1mJiYodT0hMSksdSYmKHB8fChtPXRoaXMuZ2V0KHQpKSx2JiYocj1uLnNldFZhbHVlKGUuY2xvbmUobSksdixyKSxyPT09dW5kZWZpbmVkJiYodT0hMSkpLHUmJighdGhpcy5fZmlyZUF0dHJDaGFuZ2V8fHk/dGhpcy5fc2V0QXR0clZhbCh0LGQsbSxyLHMsaCk6dGhpcy5fZmlyZUF0dHJDaGFuZ2UodCxkLG0scixzLGgpKSksdGhpc30sX2FkZE91dE9mT3JkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtuW2VdPXQsZGVsZXRlIHRoaXMuX3RDZmdzW2VdLHRoaXMuX2FkZEF0dHJzKG4sdGhpcy5fdFZhbHMpfSxfZ2V0QXR0cjpmdW5jdGlvbihlKXt2YXIgdD1lLHI9dGhpcy5fdENmZ3MscyxvLHUsYTtyZXR1cm4gZS5pbmRleE9mKGkpIT09LTEmJihzPWUuc3BsaXQoaSksZT1zLnNoaWZ0KCkpLHImJnJbZV0mJnRoaXMuX2FkZE91dE9mT3JkZXIoZSxyW2VdKSxhPXRoaXMuX3N0YXRlLmRhdGFbZV18fHt9LGEubGF6eSYmKGE9YS5sYXp5LHRoaXMuX2FkZExhenlBdHRyKGUsYSkpLHU9dGhpcy5fZ2V0U3RhdGVWYWwoZSxhKSxvPWEuZ2V0dGVyLG8mJiFvLmNhbGwmJihvPXRoaXNbb10pLHU9bz9vLmNhbGwodGhpcyx1LHQpOnUsdT1zP24uZ2V0VmFsdWUodSxzKTp1LHV9LF9nZXRTdGF0ZVZhbDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX3N0YXRlUHJveHk7cmV0dXJuIHR8fCh0PXRoaXMuX3N0YXRlLmdldEFsbChlKXx8e30pLG4mJmUgaW4gbiYmIXQuX2J5cGFzc1Byb3h5P25bZV06dC52YWx1ZX0sX3NldFN0YXRlVmFsOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fc3RhdGVQcm94eTtuJiZlIGluIG4mJiF0aGlzLl9zdGF0ZS5nZXQoZSx2KT9uW2VdPXQ6dGhpcy5fc3RhdGUuYWRkKGUsYyx0KX0sX3NldEF0dHJWYWw6ZnVuY3Rpb24oZSx0LG4saSxzLG8pe3ZhciB1PXRoaXMsYT0hMCxmPW98fHRoaXMuX3N0YXRlLmRhdGFbZV18fHt9LGw9Zi52YWxpZGF0b3IsYz1mLnNldHRlcixoPWYuaW5pdGlhbGl6aW5nLHA9dGhpcy5fZ2V0U3RhdGVWYWwoZSxmKSxkPXR8fGUsdixnO3JldHVybiBsJiYobC5jYWxsfHwobD10aGlzW2xdKSxsJiYoZz1sLmNhbGwodSxpLGQscyksIWcmJmgmJihpPWYuZGVmYXVsdFZhbHVlLGc9ITApKSksIWx8fGc/KGMmJihjLmNhbGx8fChjPXRoaXNbY10pLGMmJih2PWMuY2FsbCh1LGksZCxzKSx2PT09eT9oP2k9Zi5kZWZhdWx0VmFsdWU6YT0hMTp2IT09dW5kZWZpbmVkJiYoaT12KSkpLGEmJighdCYmaT09PXAmJiFyLmlzT2JqZWN0KGkpP2E9ITE6KG0gaW4gZnx8KGYuaW5pdFZhbHVlPWkpLHUuX3NldFN0YXRlVmFsKGUsaSkpKSk6YT0hMSxhfSxzZXRBdHRyczpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9zZXRBdHRycyhlLHQpfSxfc2V0QXR0cnM6ZnVuY3Rpb24oZSx0KXt2YXIgbjtmb3IobiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJnRoaXMuc2V0KG4sZVtuXSx0KTtyZXR1cm4gdGhpc30sZ2V0QXR0cnM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2dldEF0dHJzKGUpfSxfZ2V0QXR0cnM6ZnVuY3Rpb24oZSl7dmFyIHQ9e30scixpLHMsbz1lPT09ITA7aWYoIWV8fG8pZT1uLmtleXModGhpcy5fc3RhdGUuZGF0YSk7Zm9yKGk9MCxzPWUubGVuZ3RoO2k8cztpKyspe3I9ZVtpXTtpZighb3x8dGhpcy5fZ2V0U3RhdGVWYWwocikhPXRoaXMuX3N0YXRlLmdldChyLG0pKXRbcl09dGhpcy5nZXQocil9cmV0dXJuIHR9LGFkZEF0dHJzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZSYmKHRoaXMuX3RDZmdzPWUsdGhpcy5fdFZhbHM9dD90aGlzLl9ub3JtQXR0clZhbHModCk6bnVsbCx0aGlzLl9hZGRBdHRycyhlLHRoaXMuX3RWYWxzLG4pLHRoaXMuX3RDZmdzPXRoaXMuX3RWYWxzPW51bGwpLHRoaXN9LF9hZGRBdHRyczpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fdENmZ3MsaT10aGlzLl90VmFscyxzLG8sdTtmb3IocyBpbiBlKWUuaGFzT3duUHJvcGVydHkocykmJihvPWVbc10sby5kZWZhdWx0VmFsdWU9by52YWx1ZSx1PXRoaXMuX2dldEF0dHJJbml0VmFsKHMsbyxpKSx1IT09dW5kZWZpbmVkJiYoby52YWx1ZT11KSxyW3NdJiYocltzXT11bmRlZmluZWQpLHRoaXMuYWRkQXR0cihzLG8sbikpfSxfcHJvdGVjdEF0dHJzOmIucHJvdGVjdEF0dHJzLF9ub3JtQXR0clZhbHM6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLHMsbyx1O2lmKCFlKXJldHVybiBudWxsO3Q9e307Zm9yKHUgaW4gZSllLmhhc093blByb3BlcnR5KHUpJiYodS5pbmRleE9mKGkpIT09LTE/KHI9dS5zcGxpdChpKSxzPXIuc2hpZnQoKSxuPW58fHt9LG89bltzXT1uW3NdfHxbXSxvW28ubGVuZ3RoXT17cGF0aDpyLHZhbHVlOmVbdV19KTp0W3VdPWVbdV0pO3JldHVybntzaW1wbGU6dCxjb21wbGV4Om59fSxfZ2V0QXR0ckluaXRWYWw6ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPXQudmFsdWUscz10LnZhbHVlRm4sbyx1PSExLGE9dC5yZWFkT25seSxmLGwsYyxoLHAsZCx2OyFhJiZyJiYoZj1yLnNpbXBsZSxmJiZmLmhhc093blByb3BlcnR5KGUpJiYoaT1mW2VdLHU9ITApKSxzJiYhdSYmKHMuY2FsbHx8KHM9dGhpc1tzXSkscyYmKG89cy5jYWxsKHRoaXMsZSksaT1vKSk7aWYoIWEmJnIpe2w9ci5jb21wbGV4O2lmKGwmJmwuaGFzT3duUHJvcGVydHkoZSkmJmkhPT11bmRlZmluZWQmJmkhPT1udWxsKXt2PWxbZV07Zm9yKGM9MCxoPXYubGVuZ3RoO2M8aDsrK2MpcD12W2NdLnBhdGgsZD12W2NdLnZhbHVlLG4uc2V0VmFsdWUoaSxwLGQpfX1yZXR1cm4gaX0sX2luaXRBdHRyczpmdW5jdGlvbih0LG4scil7dD10fHx0aGlzLmNvbnN0cnVjdG9yLkFUVFJTO3ZhciBpPWUuQmFzZSxzPWUuQmFzZUNvcmUsbz1pJiZlLmluc3RhbmNlT2YodGhpcyxpKSx1PSFvJiZzJiZlLmluc3RhbmNlT2YodGhpcyxzKTt0JiYhbyYmIXUmJnRoaXMuYWRkQXR0cnMoZS5BdHRyaWJ1dGVDb3JlLnByb3RlY3RBdHRycyh0KSxuLHIpfX0sZS5BdHRyaWJ1dGVDb3JlPWJ9LCIzLjE3LjIiLHtyZXF1aXJlczpbIm9vcCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJldmVudC1jdXN0b20tY29tcGxleCIsZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5PYmplY3QscyxvPXt9LHU9ZS5DdXN0b21FdmVudC5wcm90b3R5cGUsYT1lLkV2ZW50VGFyZ2V0LnByb3RvdHlwZSxmPWZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKG4gaW4gdClyLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX07ZS5FdmVudEZhY2FkZT1mdW5jdGlvbihlLHQpe2V8fChlPW8pLHRoaXMuX2V2ZW50PWUsdGhpcy5kZXRhaWxzPWUuZGV0YWlscyx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuX3R5cGU9ZS50eXBlLHRoaXMudGFyZ2V0PWUudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD10LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXR9LGUubWl4KGUuRXZlbnRGYWNhZGUucHJvdG90eXBlLHtzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLl9ldmVudC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BwZWQ9MX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wcGVkPTJ9LHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQucHJldmVudERlZmF1bHQoKSx0aGlzLnByZXZlbnRlZD0xfSxoYWx0OmZ1bmN0aW9uKGUpe3RoaXMuX2V2ZW50LmhhbHQoZSksdGhpcy5wcmV2ZW50ZWQ9MSx0aGlzLnN0b3BwZWQ9ZT8yOjF9fSksdS5maXJlQ29tcGxleD1mdW5jdGlvbih0KXt2YXIgbixyLGkscyxvLHU9ITAsYSxmLGwsYyxoLHAsZCx2LG0sZz10aGlzLHk9Zy5ob3N0fHxnLGIsdyxFPWcuc3RhY2ssUz15Ll95dWlldnQseDtpZihFJiZnLnF1ZXVhYmxlJiZnLnR5cGUhPT1FLm5leHQudHlwZSlyZXR1cm4gRS5xdWV1ZXx8KEUucXVldWU9W10pLEUucXVldWUucHVzaChbZyx0XSksITA7eD1nLmhhc1N1YnMoKXx8Uy5oYXNUYXJnZXRzfHxnLmJyb2FkY2FzdCxnLnRhcmdldD1nLnRhcmdldHx8eSxnLmN1cnJlbnRUYXJnZXQ9eSxnLmRldGFpbHM9dC5jb25jYXQoKTtpZih4KXtuPUV8fHtpZDpnLmlkLG5leHQ6ZyxzaWxlbnQ6Zy5zaWxlbnQsc3RvcHBlZDowLHByZXZlbnRlZDowLGJ1YmJsaW5nOm51bGwsdHlwZTpnLnR5cGUsZGVmYXVsdFRhcmdldE9ubHk6Zy5kZWZhdWx0VGFyZ2V0T25seX0sZj1nLmdldFN1YnMoKSxsPWZbMF0sYz1mWzFdLGcuc3RvcHBlZD1nLnR5cGUhPT1uLnR5cGU/MDpuLnN0b3BwZWQsZy5wcmV2ZW50ZWQ9Zy50eXBlIT09bi50eXBlPzA6bi5wcmV2ZW50ZWQsZy5zdG9wcGVkRm4mJihhPW5ldyBlLkV2ZW50VGFyZ2V0KHtmaXJlT25jZTohMCxjb250ZXh0Onl9KSxnLmV2ZW50cz1hLGEub24oInN0b3BwZWQiLGcuc3RvcHBlZEZuKSksZy5fZmFjYWRlPW51bGwscj1nLl9jcmVhdGVGYWNhZGUodCksbCYmZy5fcHJvY1N1YnMobCx0LHIpLGcuYnViYmxlcyYmeS5idWJibGUmJiFnLnN0b3BwZWQmJih3PW4uYnViYmxpbmcsbi5idWJibGluZz1nLnR5cGUsbi50eXBlIT09Zy50eXBlJiYobi5zdG9wcGVkPTAsbi5wcmV2ZW50ZWQ9MCksdT15LmJ1YmJsZShnLHQsbnVsbCxuKSxnLnN0b3BwZWQ9TWF0aC5tYXgoZy5zdG9wcGVkLG4uc3RvcHBlZCksZy5wcmV2ZW50ZWQ9TWF0aC5tYXgoZy5wcmV2ZW50ZWQsbi5wcmV2ZW50ZWQpLG4uYnViYmxpbmc9dyksZD1nLnByZXZlbnRlZCxkPyh2PWcucHJldmVudGVkRm4sdiYmdi5hcHBseSh5LHQpKToobT1nLmRlZmF1bHRGbixtJiYoIWcuZGVmYXVsdFRhcmdldE9ubHkmJiFuLmRlZmF1bHRUYXJnZXRPbmx5fHx5PT09ci50YXJnZXQpJiZtLmFwcGx5KHksdCkpLGcuYnJvYWRjYXN0JiZnLl9icm9hZGNhc3QodCk7aWYoYyYmIWcucHJldmVudGVkJiZnLnN0b3BwZWQ8Mil7aD1uLmFmdGVyUXVldWU7aWYobi5pZD09PWcuaWR8fGcudHlwZSE9PVMuYnViYmxpbmcpe2cuX3Byb2NTdWJzKGMsdCxyKTtpZihoKXdoaWxlKGI9aC5sYXN0KCkpYigpfWVsc2UgcD1jLG4uZXhlY0RlZmF1bHRDbnQmJihwPWUubWVyZ2UocCksZS5lYWNoKHAsZnVuY3Rpb24oZSl7ZS5wb3N0cG9uZWQ9ITB9KSksaHx8KG4uYWZ0ZXJRdWV1ZT1uZXcgZS5RdWV1ZSksbi5hZnRlclF1ZXVlLmFkZChmdW5jdGlvbigpe2cuX3Byb2NTdWJzKHAsdCxyKX0pfWcudGFyZ2V0PW51bGw7aWYobi5pZD09PWcuaWQpe3M9bi5xdWV1ZTtpZihzKXdoaWxlKHMubGVuZ3RoKWk9cy5wb3AoKSxvPWlbMF0sbi5uZXh0PW8sby5fZmlyZShpWzFdKTtnLnN0YWNrPW51bGx9dT0hZy5zdG9wcGVkLGcudHlwZSE9PVMuYnViYmxpbmcmJihuLnN0b3BwZWQ9MCxuLnByZXZlbnRlZD0wLGcuc3RvcHBlZD0wLGcucHJldmVudGVkPTApfWVsc2UgbT1nLmRlZmF1bHRGbixtJiYocj1nLl9jcmVhdGVGYWNhZGUodCksKCFnLmRlZmF1bHRUYXJnZXRPbmx5fHx5PT09ci50YXJnZXQpJiZtLmFwcGx5KHksdCkpO3JldHVybiBnLl9mYWNhZGU9bnVsbCx1fSx1Ll9oYXNQb3RlbnRpYWxTdWJzY3JpYmVycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc1N1YnMoKXx8dGhpcy5ob3N0Ll95dWlldnQuaGFzVGFyZ2V0c3x8dGhpcy5icm9hZGNhc3R9LHUuX2NyZWF0ZUZhY2FkZT11Ll9nZXRGYWNhZGU9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5kZXRhaWxzLHI9biYmblswXSxpPXImJnR5cGVvZiByPT0ib2JqZWN0IixzPXRoaXMuX2ZhY2FkZTtyZXR1cm4gc3x8KHM9bmV3IGUuRXZlbnRGYWNhZGUodGhpcyx0aGlzLmN1cnJlbnRUYXJnZXQpKSxpPyhmKHMsciksci50eXBlJiYocy50eXBlPXIudHlwZSksdCYmKHRbMF09cykpOnQmJnQudW5zaGlmdChzKSxzLmRldGFpbHM9dGhpcy5kZXRhaWxzLHMudGFyZ2V0PXRoaXMub3JpZ2luYWxUYXJnZXR8fHRoaXMudGFyZ2V0LHMuY3VycmVudFRhcmdldD10aGlzLmN1cnJlbnRUYXJnZXQscy5zdG9wcGVkPTAscy5wcmV2ZW50ZWQ9MCx0aGlzLl9mYWNhZGU9cyx0aGlzLl9mYWNhZGV9LHUuX2FkZEZhY2FkZVRvQXJncz1mdW5jdGlvbihlKXt2YXIgdD1lWzBdO3QmJnQuaGFsdCYmdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJnQuc3RvcFByb3BhZ2F0aW9uJiZ0Ll9ldmVudHx8dGhpcy5fY3JlYXRlRmFjYWRlKGUpfSx1LnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe3RoaXMuc3RvcHBlZD0xLHRoaXMuc3RhY2smJih0aGlzLnN0YWNrLnN0b3BwZWQ9MSksdGhpcy5ldmVudHMmJnRoaXMuZXZlbnRzLmZpcmUoInN0b3BwZWQiLHRoaXMpfSx1LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbj1mdW5jdGlvbigpe3RoaXMuc3RvcHBlZD0yLHRoaXMuc3RhY2smJih0aGlzLnN0YWNrLnN0b3BwZWQ9MiksdGhpcy5ldmVudHMmJnRoaXMuZXZlbnRzLmZpcmUoInN0b3BwZWQiLHRoaXMpfSx1LnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dGhpcy5wcmV2ZW50YWJsZSYmKHRoaXMucHJldmVudGVkPTEsdGhpcy5zdGFjayYmKHRoaXMuc3RhY2sucHJldmVudGVkPTEpKX0sdS5oYWx0PWZ1bmN0aW9uKGUpe2U/dGhpcy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTp0aGlzLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMucHJldmVudERlZmF1bHQoKX0sYS5hZGRUYXJnZXQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5feXVpZXZ0O3JldHVybiBuLnRhcmdldHN8fChuLnRhcmdldHM9e30pLG4udGFyZ2V0c1tlLnN0YW1wKHQpXT10LG4uaGFzVGFyZ2V0cz0hMCx0aGlzfSxhLmdldFRhcmdldHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl95dWlldnQudGFyZ2V0cztyZXR1cm4gZT9pLnZhbHVlcyhlKTpbXX0sYS5yZW1vdmVUYXJnZXQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5feXVpZXZ0LnRhcmdldHM7cmV0dXJuIG4mJihkZWxldGUgbltlLnN0YW1wKHQsITApXSxpLnNpemUobik9PT0wJiYodGhpcy5feXVpZXZ0Lmhhc1RhcmdldHM9ITEpKSx0aGlzfSxhLmJ1YmJsZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLl95dWlldnQudGFyZ2V0cyxzPSEwLG8sdSxhLGYsbCxjPWUmJmUudHlwZSxoPW58fGUmJmUudGFyZ2V0fHx0aGlzLHA7aWYoIWV8fCFlLnN0b3BwZWQmJmkpZm9yKGEgaW4gaSlpZihpLmhhc093blByb3BlcnR5KGEpKXtvPWlbYV0sdT1vLl95dWlldnQuZXZlbnRzW2NdLG8uX2hhc1NpYmxpbmdzJiYobD1vLmdldFNpYmxpbmcoYyx1KSksbCYmIXUmJih1PW8ucHVibGlzaChjKSkscD1vLl95dWlldnQuYnViYmxpbmcsby5feXVpZXZ0LmJ1YmJsaW5nPWM7aWYoIXUpby5feXVpZXZ0Lmhhc1RhcmdldHMmJm8uYnViYmxlKGUsdCxoLHIpO2Vsc2V7bCYmKHUuc2libGluZz1sKSx1LnRhcmdldD1oLHUub3JpZ2luYWxUYXJnZXQ9aCx1LmN1cnJlbnRUYXJnZXQ9byxmPXUuYnJvYWRjYXN0LHUuYnJvYWRjYXN0PSExLHUuZW1pdEZhY2FkZT0hMCx1LnN0YWNrPXIscz1zJiZ1LmZpcmUuYXBwbHkodSx0fHxlLmRldGFpbHN8fFtdKSx1LmJyb2FkY2FzdD1mLHUub3JpZ2luYWxUYXJnZXQ9bnVsbDtpZih1LnN0b3BwZWQpYnJlYWt9by5feXVpZXZ0LmJ1YmJsaW5nPXB9cmV0dXJuIHN9LGEuX2hhc1BvdGVudGlhbFN1YnNjcmliZXJzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3l1aWV2dCxuPXQuZXZlbnRzW2VdO3JldHVybiBuP24uaGFzU3VicygpfHx0Lmhhc1RhcmdldHN8fG4uYnJvYWRjYXN0OiExfSxuPW5ldyBlLkV2ZW50RmFjYWRlLHI9e307Zm9yKHMgaW4gbilyW3NdPSEwfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1jdXN0b20tYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJiYXNlLWNvcmUiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gdihlKXt0aGlzLl9CYXNlSW52b2tlZHx8KHRoaXMuX0Jhc2VJbnZva2VkPSEwLHRoaXMuX2luaXRCYXNlKGUpKX12YXIgbj1lLk9iamVjdCxyPWUuTGFuZyxpPSIuIixzPSJpbml0aWFsaXplZCIsbz0iZGVzdHJveWVkIix1PSJpbml0aWFsaXplciIsYT0idmFsdWUiLGY9T2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcixsPSJkZWVwIixjPSJzaGFsbG93IixoPSJkZXN0cnVjdG9yIixwPWUuQXR0cmlidXRlQ29yZSxkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtmb3IociBpbiB0KW5bcl0mJihlW3JdPXRbcl0pO3JldHVybiBlfTt2Ll9BVFRSX0NGRz1wLl9BVFRSX0NGRy5jb25jYXQoImNsb25lRGVmYXVsdFZhbHVlIiksdi5fTk9OX0FUVFJTX0NGRz1bInBsdWdpbnMiXSx2Lk5BTUU9ImJhc2VDb3JlIix2LkFUVFJTPXtpbml0aWFsaXplZDp7cmVhZE9ubHk6ITAsdmFsdWU6ITF9LGRlc3Ryb3llZDp7cmVhZE9ubHk6ITAsdmFsdWU6ITF9fSx2Lm1vZGlmeUF0dHJzPWZ1bmN0aW9uKHQsbil7dHlwZW9mIHQhPSJmdW5jdGlvbiImJihuPXQsdD10aGlzKTt2YXIgcixpLHM7cj10LkFUVFJTfHwodC5BVFRSUz17fSk7aWYobil7dC5fQ0FDSEVEX0NMQVNTX0RBVEE9bnVsbDtmb3IocyBpbiBuKW4uaGFzT3duUHJvcGVydHkocykmJihpPXJbc118fChyW3NdPXt9KSxlLm1peChpLG5bc10sITApKX19LHYucHJvdG90eXBlPXtfaW5pdEJhc2U6ZnVuY3Rpb24odCl7ZS5zdGFtcCh0aGlzKSx0aGlzLl9pbml0QXR0cmlidXRlKHQpO3ZhciBuPWUuUGx1Z2luJiZlLlBsdWdpbi5Ib3N0O3RoaXMuX2luaXRQbHVnaW5zJiZuJiZuLmNhbGwodGhpcyksdGhpcy5fbGF6eUFkZEF0dHJzIT09ITEmJih0aGlzLl9sYXp5QWRkQXR0cnM9ITApLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLk5BTUUsdGhpcy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX2luaXRBdHRyaWJ1dGU6ZnVuY3Rpb24oKXtwLmNhbGwodGhpcyl9LGluaXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2Jhc2VJbml0KGUpLHRoaXN9LF9iYXNlSW5pdDpmdW5jdGlvbihlKXt0aGlzLl9pbml0SGllcmFyY2h5KGUpLHRoaXMuX2luaXRQbHVnaW5zJiZ0aGlzLl9pbml0UGx1Z2lucyhlKSx0aGlzLl9zZXQocywhMCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZURlc3Ryb3koKSx0aGlzfSxfYmFzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9kZXN0cm95UGx1Z2lucyYmdGhpcy5fZGVzdHJveVBsdWdpbnMoKSx0aGlzLl9kZXN0cm95SGllcmFyY2h5KCksdGhpcy5fc2V0KG8sITApfSxfZ2V0Q2xhc3NlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jbGFzc2VzfHx0aGlzLl9pbml0SGllcmFyY2h5RGF0YSgpLHRoaXMuX2NsYXNzZXN9LF9nZXRBdHRyQ2ZnczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hdHRyc3x8dGhpcy5faW5pdEhpZXJhcmNoeURhdGEoKSx0aGlzLl9hdHRyc30sX2dldEluc3RhbmNlQXR0ckNmZ3M6ZnVuY3Rpb24oZSl7dmFyIHQ9e30scixpLHMsbyx1LGEsZixsPWUuX3N1YkF0dHJzLGM9dGhpcy5fYXR0ckNmZ0hhc2goKTtmb3IoYSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoYSkmJmEhPT0iX3N1YkF0dHJzIil7Zj1lW2FdLHI9dFthXT1kKHt9LGYsYyksaT1yLnZhbHVlLGkmJnR5cGVvZiBpPT0ib2JqZWN0IiYmdGhpcy5fY2xvbmVEZWZhdWx0VmFsdWUoYSxyKTtpZihsJiZsLmhhc093blByb3BlcnR5KGEpKXtvPWUuX3N1YkF0dHJzW2FdO2Zvcih1IGluIG8pcz1vW3VdLHMucGF0aCYmbi5zZXRWYWx1ZShyLnZhbHVlLHMucGF0aCxzLnZhbHVlKX19cmV0dXJuIHR9LF9maWx0ZXJBZEhvY0F0dHJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLl9ub25BdHRycyxpO2lmKHQpe249e307Zm9yKGkgaW4gdCkhZVtpXSYmIXJbaV0mJnQuaGFzT3duUHJvcGVydHkoaSkmJihuW2ldPXt2YWx1ZTp0W2ldfSl9cmV0dXJuIG59LF9pbml0SGllcmFyY2h5RGF0YTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuY29uc3RydWN0b3IsdD1lLl9DQUNIRURfQ0xBU1NfREFUQSxuLHIsaSxzLG8sdT0hZS5fQVRUUl9DRkdfSEFTSCxhLGY9e30sbD1bXSxjPVtdO249ZTtpZighdCl7d2hpbGUobil7bFtsLmxlbmd0aF09bixuLkFUVFJTJiYoY1tjLmxlbmd0aF09bi5BVFRSUyk7aWYodSl7cz1uLl9BVFRSX0NGRyxvPW98fHt9O2lmKHMpZm9yKHI9MCxpPXMubGVuZ3RoO3I8aTtyKz0xKW9bc1tyXV09ITB9YT1uLl9OT05fQVRUUlNfQ0ZHO2lmKGEpZm9yKHI9MCxpPWEubGVuZ3RoO3I8aTtyKyspZlthW3JdXT0hMDtuPW4uc3VwZXJjbGFzcz9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3I6bnVsbH11JiYoZS5fQVRUUl9DRkdfSEFTSD1vKSx0PWUuX0NBQ0hFRF9DTEFTU19EQVRBPXtjbGFzc2VzOmwsbm9uQXR0cnM6ZixhdHRyczp0aGlzLl9hZ2dyZWdhdGVBdHRycyhjKX19dGhpcy5fY2xhc3Nlcz10LmNsYXNzZXMsdGhpcy5fYXR0cnM9dC5hdHRycyx0aGlzLl9ub25BdHRycz10Lm5vbkF0dHJzfSxfYXR0ckNmZ0hhc2g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5fQVRUUl9DRkdfSEFTSH0sX2Nsb25lRGVmYXVsdFZhbHVlOmZ1bmN0aW9uKHQsbil7dmFyIGk9bi52YWx1ZSxzPW4uY2xvbmVEZWZhdWx0VmFsdWU7cz09PWx8fHM9PT0hMD9uLnZhbHVlPWUuY2xvbmUoaSk6cz09PWM/bi52YWx1ZT1lLm1lcmdlKGkpOnM9PT11bmRlZmluZWQmJihmPT09aS5jb25zdHJ1Y3Rvcnx8ci5pc0FycmF5KGkpKSYmKG4udmFsdWU9ZS5jbG9uZShpKSl9LF9hZ2dyZWdhdGVBdHRyczpmdW5jdGlvbihlKXt2YXIgdCxuLHIscyxvLHUsZj10aGlzLl9hdHRyQ2ZnSGFzaCgpLGwsYz17fTtpZihlKWZvcih1PWUubGVuZ3RoLTE7dT49MDstLXUpe249ZVt1XTtmb3IodCBpbiBuKW4uaGFzT3duUHJvcGVydHkodCkmJihzPWQoe30sblt0XSxmKSxvPW51bGwsdC5pbmRleE9mKGkpIT09LTEmJihvPXQuc3BsaXQoaSksdD1vLnNoaWZ0KCkpLGw9Y1t0XSxvJiZsJiZsLnZhbHVlPyhyPWMuX3N1YkF0dHJzLHJ8fChyPWMuX3N1YkF0dHJzPXt9KSxyW3RdfHwoclt0XT17fSksclt0XVtvLmpvaW4oaSldPXt2YWx1ZTpzLnZhbHVlLHBhdGg6b30pOm98fChsPyhsLnZhbHVlRm4mJmEgaW4gcyYmKGwudmFsdWVGbj1udWxsKSxkKGwscyxmKSk6Y1t0XT1zKSl9cmV0dXJuIGN9LF9pbml0SGllcmFyY2h5OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xhenlBZGRBdHRycyxuLHIsaSxzLG8sYSxmLGwsYyxoLHAsZD1bXSx2PXRoaXMuX2dldENsYXNzZXMoKSxtPXRoaXMuX2dldEF0dHJDZmdzKCksZz12Lmxlbmd0aC0xO2ZvcihvPWc7bz49MDtvLS0pe249dltvXSxyPW4ucHJvdG90eXBlLGg9bi5feXVpYnVpbGQmJm4uX3l1aWJ1aWxkLmV4dHMsci5oYXNPd25Qcm9wZXJ0eSh1KSYmKGRbZC5sZW5ndGhdPXIuaW5pdGlhbGl6ZXIpO2lmKGgpZm9yKGE9MCxmPWgubGVuZ3RoO2E8ZjthKyspbD1oW2FdLGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLGM9bC5wcm90b3R5cGUsYy5oYXNPd25Qcm9wZXJ0eSh1KSYmKGRbZC5sZW5ndGhdPWMuaW5pdGlhbGl6ZXIpfXA9dGhpcy5fZ2V0SW5zdGFuY2VBdHRyQ2ZncyhtKSx0aGlzLl9wcmVBZGRBdHRycyYmdGhpcy5fcHJlQWRkQXR0cnMocCxlLHQpLHRoaXMuX2FsbG93QWRIb2NBdHRycyYmdGhpcy5hZGRBdHRycyh0aGlzLl9maWx0ZXJBZEhvY0F0dHJzKG0sZSksZSx0KSx0aGlzLmFkZEF0dHJzKHAsZSx0KTtmb3IoaT0wLHM9ZC5sZW5ndGg7aTxzO2krKylkW2ldLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX2Rlc3Ryb3lIaWVyYXJjaHk6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLHMsbyx1LGE9dGhpcy5fZ2V0Q2xhc3NlcygpO2ZvcihuPTAscj1hLmxlbmd0aDtuPHI7bisrKXtlPWFbbl0sdD1lLnByb3RvdHlwZSxvPWUuX3l1aWJ1aWxkJiZlLl95dWlidWlsZC5leHRzO2lmKG8pZm9yKGk9MCxzPW8ubGVuZ3RoO2k8cztpKyspdT1vW2ldLnByb3RvdHlwZSx1Lmhhc093blByb3BlcnR5KGgpJiZ1LmRlc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpO3QuaGFzT3duUHJvcGVydHkoaCkmJnQuZGVzdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIlsiK2Uuc3RhbXAodGhpcywhMCkrIl0ifX0sZS5taXgodixwLCExLG51bGwsMSksdi5wcm90b3R5cGUuY29uc3RydWN0b3I9dixlLkJhc2VDb3JlPXZ9LCIzLjE3LjIiLHtyZXF1aXJlczpbImF0dHJpYnV0ZS1jb3JlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImF0dHJpYnV0ZS1iYXNlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtlLkF0dHJpYnV0ZUNvcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUuQXR0cmlidXRlT2JzZXJ2YWJsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS5BdHRyaWJ1dGVFeHRyYXMuYXBwbHkodGhpcyxhcmd1bWVudHMpfWUubWl4KG4sZS5BdHRyaWJ1dGVDb3JlLCExLG51bGwsMSksZS5taXgobixlLkF0dHJpYnV0ZUV4dHJhcywhMSxudWxsLDEpLGUubWl4KG4sZS5BdHRyaWJ1dGVPYnNlcnZhYmxlLCEwLG51bGwsMSksbi5JTlZBTElEX1ZBTFVFPWUuQXR0cmlidXRlQ29yZS5JTlZBTElEX1ZBTFVFLG4uX0FUVFJfQ0ZHPWUuQXR0cmlidXRlQ29yZS5fQVRUUl9DRkcuY29uY2F0KGUuQXR0cmlidXRlT2JzZXJ2YWJsZS5fQVRUUl9DRkcpLG4ucHJvdGVjdEF0dHJzPWUuQXR0cmlidXRlQ29yZS5wcm90ZWN0QXR0cnMsZS5BdHRyaWJ1dGU9bn0sIjMuMTcuMiIse3JlcXVpcmVzOlsiYXR0cmlidXRlLWNvcmUiLCJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImF0dHJpYnV0ZS1leHRyYXMiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiYXR0cmlidXRlLWV4dHJhcyIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBvKCl7fXZhciBuPSJicm9hZGNhc3QiLHI9InB1Ymxpc2hlZCIsaT0iaW5pdFZhbHVlIixzPXtyZWFkT25seToxLHdyaXRlT25jZToxLGdldHRlcjoxLGJyb2FkY2FzdDoxfTtvLnByb3RvdHlwZT17bW9kaWZ5QXR0cjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMsbyx1O2lmKGkuYXR0ckFkZGVkKGUpKXtpLl9pc0xhenlBdHRyKGUpJiZpLl9hZGRMYXp5QXR0cihlKSx1PWkuX3N0YXRlO2ZvcihvIGluIHQpc1tvXSYmdC5oYXNPd25Qcm9wZXJ0eShvKSYmKHUuYWRkKGUsbyx0W29dKSxvPT09biYmdS5yZW1vdmUoZSxyKSl9fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3RoaXMuX3N0YXRlLnJlbW92ZUFsbChlKX0scmVzZXQ6ZnVuY3Rpb24odCl7dmFyIG49dGhpcztyZXR1cm4gdD8obi5faXNMYXp5QXR0cih0KSYmbi5fYWRkTGF6eUF0dHIodCksbi5zZXQodCxuLl9zdGF0ZS5nZXQodCxpKSkpOmUuT2JqZWN0LmVhY2gobi5fc3RhdGUuZGF0YSxmdW5jdGlvbihlLHQpe24ucmVzZXQodCl9KSxufSxfZ2V0QXR0ckNmZzpmdW5jdGlvbih0KXt2YXIgbixyPXRoaXMuX3N0YXRlO3JldHVybiB0P249ci5nZXRBbGwodCl8fHt9OihuPXt9LGUuZWFjaChyLmRhdGEsZnVuY3Rpb24oZSx0KXtuW3RdPXIuZ2V0QWxsKHQpfSkpLG59fSxlLkF0dHJpYnV0ZUV4dHJhcz1vfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJvb3AiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiYXR0cmlidXRlLW9ic2VydmFibGUiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gcygpe3RoaXMuX0FUVFJfRV9GQUNBREU9e30sbi5jYWxsKHRoaXMse2VtaXRGYWNhZGU6ITB9KX12YXIgbj1lLkV2ZW50VGFyZ2V0LHI9IkNoYW5nZSIsaT0iYnJvYWRjYXN0IjtzLl9BVFRSX0NGRz1baV0scy5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuX3NldEF0dHIoZSx0LG4pfSxfc2V0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fc2V0QXR0cihlLHQsbiwhMCl9LHNldEF0dHJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3NldEF0dHJzKGUsdCl9LF9zZXRBdHRyczpmdW5jdGlvbihlLHQpe3ZhciBuO2ZvcihuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmdGhpcy5zZXQobixlW25dLHQpO3JldHVybiB0aGlzfSxfZmlyZUF0dHJDaGFuZ2U6ZnVuY3Rpb24odCxuLGkscyxvLHUpe3ZhciBhPXRoaXMsZj10aGlzLl9nZXRGdWxsVHlwZSh0K3IpLGw9YS5fc3RhdGUsYyxoLHA7dXx8KHU9bC5kYXRhW3RdfHx7fSksdS5wdWJsaXNoZWR8fChwPWEuX3B1Ymxpc2goZikscC5lbWl0RmFjYWRlPSEwLHAuZGVmYXVsdFRhcmdldE9ubHk9ITAscC5kZWZhdWx0Rm49YS5fZGVmQXR0ckNoYW5nZUZuLGg9dS5icm9hZGNhc3QsaCE9PXVuZGVmaW5lZCYmKHAuYnJvYWRjYXN0PWgpLHUucHVibGlzaGVkPSEwKSxvPyhjPWUubWVyZ2UobyksYy5fYXR0ck9wdHM9byk6Yz1hLl9BVFRSX0VfRkFDQURFLGMuYXR0ck5hbWU9dCxjLnN1YkF0dHJOYW1lPW4sYy5wcmV2VmFsPWksYy5uZXdWYWw9cyxhLl9oYXNQb3RlbnRpYWxTdWJzY3JpYmVycyhmKT9hLmZpcmUoZixjKTp0aGlzLl9zZXRBdHRyVmFsKHQsbixpLHMsbyx1KX0sX2RlZkF0dHJDaGFuZ2VGbjpmdW5jdGlvbihlLHQpe3ZhciBuPWUuX2F0dHJPcHRzO24mJmRlbGV0ZSBlLl9hdHRyT3B0cyx0aGlzLl9zZXRBdHRyVmFsKGUuYXR0ck5hbWUsZS5zdWJBdHRyTmFtZSxlLnByZXZWYWwsZS5uZXdWYWwsbik/dHx8KGUubmV3VmFsPXRoaXMuZ2V0KGUuYXR0ck5hbWUpKTp0fHxlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfX0sZS5taXgocyxuLCExLG51bGwsMSksZS5BdHRyaWJ1dGVPYnNlcnZhYmxlPXMsZS5BdHRyaWJ1dGVFdmVudHM9c30sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtY3VzdG9tIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImJhc2Utb2JzZXJ2YWJsZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBmKCl7fXZhciBuPWUuTGFuZyxyPSJkZXN0cm95IixpPSJpbml0IixzPSJidWJibGVUYXJnZXRzIixvPSJfYnViYmxlVGFyZ2V0cyIsdT1lLkF0dHJpYnV0ZU9ic2VydmFibGUsYT1lLkJhc2VDb3JlO2YuX0FUVFJfQ0ZHPXUuX0FUVFJfQ0ZHLmNvbmNhdCgpLGYuX05PTl9BVFRSU19DRkc9WyJvbiIsImFmdGVyIiwiYnViYmxlVGFyZ2V0cyJdLGYucHJvdG90eXBlPXtfaW5pdEF0dHJpYnV0ZTpmdW5jdGlvbigpe2EucHJvdG90eXBlLl9pbml0QXR0cmlidXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx1LmNhbGwodGhpcyksdGhpcy5fZXZlbnRQcmVmaXg9dGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9QUkVGSVh8fHRoaXMuY29uc3RydWN0b3IuTkFNRSx0aGlzLl95dWlldnQuY29uZmlnLnByZWZpeD10aGlzLl9ldmVudFByZWZpeH0saW5pdDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRGdWxsVHlwZShpKSxuPXRoaXMuX3B1Ymxpc2godCk7cmV0dXJuIG4uZW1pdEZhY2FkZT0hMCxuLmZpcmVPbmNlPSEwLG4uZGVmYXVsdFRhcmdldE9ubHk9ITAsbi5kZWZhdWx0Rm49dGhpcy5fZGVmSW5pdEZuLHRoaXMuX3ByZUluaXRFdmVudENmZyhlKSxuLl9oYXNQb3RlbnRpYWxTdWJzY3JpYmVycygpP3RoaXMuZmlyZSh0LHtjZmc6ZX0pOih0aGlzLl9iYXNlSW5pdChlKSxuLmZpcmVkPSEwLG4uZmlyZWRXaXRoPVt7Y2ZnOmV9XSksdGhpc30sX3ByZUluaXRFdmVudENmZzpmdW5jdGlvbihlKXtlJiYoZS5vbiYmdGhpcy5vbihlLm9uKSxlLmFmdGVyJiZ0aGlzLmFmdGVyKGUuYWZ0ZXIpKTt2YXIgdCxyLGksdT1lJiZzIGluIGU7aWYodXx8byBpbiB0aGlzKXtpPXU/ZSYmZS5idWJibGVUYXJnZXRzOnRoaXMuX2J1YmJsZVRhcmdldHM7aWYobi5pc0FycmF5KGkpKWZvcih0PTAscj1pLmxlbmd0aDt0PHI7dCsrKXRoaXMuYWRkVGFyZ2V0KGlbdF0pO2Vsc2UgaSYmdGhpcy5hZGRUYXJnZXQoaSl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVibGlzaChyLHtmaXJlT25jZTohMCxkZWZhdWx0VGFyZ2V0T25seTohMCxkZWZhdWx0Rm46dGhpcy5fZGVmRGVzdHJveUZufSksdGhpcy5maXJlKHIpLHRoaXMuZGV0YWNoQWxsKCksdGhpc30sX2RlZkluaXRGbjpmdW5jdGlvbihlKXt0aGlzLl9iYXNlSW5pdChlLmNmZyl9LF9kZWZEZXN0cm95Rm46ZnVuY3Rpb24oZSl7dGhpcy5fYmFzZURlc3Ryb3koZS5jZmcpfX0sZS5taXgoZix1LCExLG51bGwsMSksZS5CYXNlT2JzZXJ2YWJsZT1mfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJhdHRyaWJ1dGUtb2JzZXJ2YWJsZSIsImJhc2UtY29yZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJiYXNlLWJhc2UiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbygpe2kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBuPWUuQXR0cmlidXRlQ29yZSxyPWUuQXR0cmlidXRlRXh0cmFzLGk9ZS5CYXNlQ29yZSxzPWUuQmFzZU9ic2VydmFibGU7by5fQVRUUl9DRkc9aS5fQVRUUl9DRkcuY29uY2F0KHMuX0FUVFJfQ0ZHKSxvLl9OT05fQVRUUlNfQ0ZHPWkuX05PTl9BVFRSU19DRkcuY29uY2F0KHMuX05PTl9BVFRSU19DRkcpLG8uTkFNRT0iYmFzZSIsby5BVFRSUz1uLnByb3RlY3RBdHRycyhpLkFUVFJTKSxvLm1vZGlmeUF0dHJzPWkubW9kaWZ5QXR0cnMsZS5taXgobyxpLCExLG51bGwsMSksZS5taXgobyxyLCExLG51bGwsMSksZS5taXgobyxzLCEwLG51bGwsMSksby5wcm90b3R5cGUuY29uc3RydWN0b3I9byxlLkJhc2U9b30sIjMuMTcuMiIse3JlcXVpcmVzOlsiYXR0cmlidXRlLWJhc2UiLCJiYXNlLWNvcmUiLCJiYXNlLW9ic2VydmFibGUiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiYmFzZS1wbHVnaW5ob3N0IixmdW5jdGlvbihlLHQpe3ZhciBuPWUuQmFzZSxyPWUuUGx1Z2luLkhvc3Q7ZS5taXgobixyLCExLG51bGwsMSksbi5wbHVnPXIucGx1ZyxuLnVucGx1Zz1yLnVucGx1Z30sIjMuMTcuMiIse3JlcXVpcmVzOlsiYmFzZS1iYXNlIiwicGx1Z2luaG9zdCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJiYXNlLWJ1aWxkIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGYoZSx0LG4pe25bZV0mJih0W2VdPSh0W2VdfHxbXSkuY29uY2F0KG5bZV0pKX1mdW5jdGlvbiBsKGUsdCxuKXtuLl9BVFRSX0NGRyYmKHQuX0FUVFJfQ0ZHX0hBU0g9bnVsbCxmLmFwcGx5KG51bGwsYXJndW1lbnRzKSl9ZnVuY3Rpb24gYyhlLHQscil7bi5tb2RpZnlBdHRycyh0LHIuQVRUUlMpfXZhciBuPWUuQmFzZUNvcmUscj1lLkJhc2UsaT1lLkxhbmcscz0iaW5pdGlhbGl6ZXIiLG89ImRlc3RydWN0b3IiLHU9WyJfUExVRyIsIl9VTlBMVUciXSxhO3IuX2J1aWxkPWZ1bmN0aW9uKHQsbixpLHUsYSxmKXt2YXIgbD1yLl9idWlsZCxjPWwuX2N0b3IobixmKSxoPWwuX2NmZyhuLGYsaSkscD1sLl9taXhDdXN0LGQ9Yy5feXVpYnVpbGQuZHluYW1pYyx2LG0sZyx5LGIsdztmb3Iodj0wLG09aS5sZW5ndGg7djxtO3YrKylnPWlbdl0seT1nLnByb3RvdHlwZSxiPXlbc10sdz15W29dLGRlbGV0ZSB5W3NdLGRlbGV0ZSB5W29dLGUubWl4KGMsZywhMCxudWxsLDEpLHAoYyxnLGgpLGImJih5W3NdPWIpLHcmJih5W29dPXcpLGMuX3l1aWJ1aWxkLmV4dHMucHVzaChnKTtyZXR1cm4gdSYmZS5taXgoYy5wcm90b3R5cGUsdSwhMCksYSYmKGUubWl4KGMsbC5fY2xlYW4oYSxoKSwhMCkscChjLGEsaCkpLGMucHJvdG90eXBlLmhhc0ltcGw9bC5faW1wbCxkJiYoYy5OQU1FPXQsYy5wcm90b3R5cGUuY29uc3RydWN0b3I9YyxjLm1vZGlmeUF0dHJzPW4ubW9kaWZ5QXR0cnMpLGN9LGE9ci5fYnVpbGQsZS5taXgoYSx7X21peEN1c3Q6ZnVuY3Rpb24odCxuLHIpe3ZhciBzLG8sdSxhLGYsbDtyJiYocz1yLmFnZ3JlZ2F0ZXMsbz1yLmN1c3RvbSx1PXIuc3RhdGljcyksdSYmZS5taXgodCxuLCEwLHUpO2lmKHMpZm9yKGw9MCxmPXMubGVuZ3RoO2w8ZjtsKyspYT1zW2xdLCF0Lmhhc093blByb3BlcnR5KGEpJiZuLmhhc093blByb3BlcnR5KGEpJiYodFthXT1pLmlzQXJyYXkoblthXSk/W106e30pLGUuYWdncmVnYXRlKHQsbiwhMCxbYV0pO2lmKG8pZm9yKGwgaW4gbylvLmhhc093blByb3BlcnR5KGwpJiZvW2xdKGwsdCxuKX0sX3RtcGw6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbigpe24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGUuZXh0ZW5kKG4sdCksbn0sX2ltcGw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0Q2xhc3NlcygpLG4scixpLHMsbyx1O2ZvcihuPTAscj10Lmxlbmd0aDtuPHI7bisrKXtpPXRbbl07aWYoaS5feXVpYnVpbGQpe3M9aS5feXVpYnVpbGQuZXh0cyxvPXMubGVuZ3RoO2Zvcih1PTA7dTxvO3UrKylpZihzW3VdPT09ZSlyZXR1cm4hMH19cmV0dXJuITF9LF9jdG9yOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCYmITE9PT10LmR5bmFtaWM/ITE6ITAscj1uP2EuX3RtcGwoZSk6ZSxpPXIuX3l1aWJ1aWxkO3JldHVybiBpfHwoaT1yLl95dWlidWlsZD17fSksaS5pZD1pLmlkfHxudWxsLGkuZXh0cz1pLmV4dHN8fFtdLGkuZHluYW1pYz1uLHJ9LF9jZmc6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPVtdLHM9e30sbz1bXSx1LGE9biYmbi5hZ2dyZWdhdGVzLGY9biYmbi5jdXN0b20sbD1uJiZuLnN0YXRpY3MsYz10LGgscDt3aGlsZShjJiZjLnByb3RvdHlwZSl1PWMuX2J1aWxkQ2ZnLHUmJih1LmFnZ3JlZ2F0ZXMmJihpPWkuY29uY2F0KHUuYWdncmVnYXRlcykpLHUuY3VzdG9tJiZlLm1peChzLHUuY3VzdG9tLCEwKSx1LnN0YXRpY3MmJihvPW8uY29uY2F0KHUuc3RhdGljcykpKSxjPWMuc3VwZXJjbGFzcz9jLnN1cGVyY2xhc3MuY29uc3RydWN0b3I6bnVsbDtpZihyKWZvcihoPTAscD1yLmxlbmd0aDtoPHA7aCsrKWM9cltoXSx1PWMuX2J1aWxkQ2ZnLHUmJih1LmFnZ3JlZ2F0ZXMmJihpPWkuY29uY2F0KHUuYWdncmVnYXRlcykpLHUuY3VzdG9tJiZlLm1peChzLHUuY3VzdG9tLCEwKSx1LnN0YXRpY3MmJihvPW8uY29uY2F0KHUuc3RhdGljcykpKTtyZXR1cm4gYSYmKGk9aS5jb25jYXQoYSkpLGYmJmUubWl4KHMsbi5jZmdCdWlsZCwhMCksbCYmKG89by5jb25jYXQobCkpLHthZ2dyZWdhdGVzOmksY3VzdG9tOnMsc3RhdGljczpvfX0sX2NsZWFuOmZ1bmN0aW9uKHQsbil7dmFyIHIsaSxzLG89ZS5tZXJnZSh0KSx1PW4uYWdncmVnYXRlcyxhPW4uY3VzdG9tO2ZvcihyIGluIGEpby5oYXNPd25Qcm9wZXJ0eShyKSYmZGVsZXRlIG9bcl07Zm9yKGk9MCxzPXUubGVuZ3RoO2k8cztpKyspcj11W2ldLG8uaGFzT3duUHJvcGVydHkocikmJmRlbGV0ZSBvW3JdO3JldHVybiBvfX0pLHIuYnVpbGQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGEoZSx0LG4sbnVsbCxudWxsLHIpfSxyLmNyZWF0ZT1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBhKGUsdCxuLHIsaSl9LHIubWl4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX0NBQ0hFRF9DTEFTU19EQVRBJiYoZS5fQ0FDSEVEX0NMQVNTX0RBVEE9bnVsbCksYShudWxsLGUsdCxudWxsLG51bGwse2R5bmFtaWM6ITF9KX0sbi5fYnVpbGRDZmc9e2FnZ3JlZ2F0ZXM6dS5jb25jYXQoKSxjdXN0b206e0FUVFJTOmMsX0FUVFJfQ0ZHOmwsX05PTl9BVFRSU19DRkc6Zn19LHIuX2J1aWxkQ2ZnPXthZ2dyZWdhdGVzOnUuY29uY2F0KCksY3VzdG9tOntBVFRSUzpjLF9BVFRSX0NGRzpsLF9OT05fQVRUUlNfQ0ZHOmZ9fX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiYmFzZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LXN5bnRoZXRpYyIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBjKGUsdCl7dGhpcy5oYW5kbGU9ZSx0aGlzLmVtaXRGYWNhZGU9dH1mdW5jdGlvbiBoKGUsdCxuKXt0aGlzLmhhbmRsZXM9W10sdGhpcy5lbD1lLHRoaXMua2V5PW4sdGhpcy5kb21rZXk9dH1mdW5jdGlvbiBwKCl7dGhpcy5faW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIG49ZS5DdXN0b21FdmVudCxyPWUuRW52LmV2dC5kb21fbWFwLGk9ZS5BcnJheSxzPWUuTGFuZyxvPXMuaXNPYmplY3QsdT1zLmlzU3RyaW5nLGE9cy5pc0FycmF5LGY9ZS5TZWxlY3Rvci5xdWVyeSxsPWZ1bmN0aW9uKCl7fTtjLnByb3RvdHlwZS5maXJlPWZ1bmN0aW9uKHQpe3ZhciBuPWkoYXJndW1lbnRzLDAsITApLHI9dGhpcy5oYW5kbGUscz1yLmV2dCx1PXIuc3ViLGE9dS5jb250ZXh0LGY9dS5maWx0ZXIsbD10fHx7fSxjO2lmKHRoaXMuZW1pdEZhY2FkZSl7aWYoIXR8fCF0LnByZXZlbnREZWZhdWx0KWw9cy5fZ2V0RmFjYWRlKCksbyh0KSYmIXQucHJldmVudERlZmF1bHQ/KGUubWl4KGwsdCwhMCksblswXT1sKTpuLnVuc2hpZnQobCk7bC50eXBlPXMudHlwZSxsLmRldGFpbHM9bi5zbGljZSgpLGYmJihsLmNvbnRhaW5lcj1zLmhvc3QpfWVsc2UgZiYmbyh0KSYmdC5jdXJyZW50VGFyZ2V0JiZuLnNoaWZ0KCk7cmV0dXJuIHUuY29udGV4dD1hfHxsLmN1cnJlbnRUYXJnZXR8fHMuaG9zdCxjPXMuZmlyZS5hcHBseShzLG4pLHQucHJldmVudGVkJiZzLnByZXZlbnRlZEZuJiZzLnByZXZlbnRlZEZuLmFwcGx5KHMsbiksdC5zdG9wcGVkJiZzLnN0b3BwZWRGbiYmcy5zdG9wcGVkRm4uYXBwbHkocyxuKSx1LmNvbnRleHQ9YSxjfSxoLnByb3RvdHlwZT17Y29uc3RydWN0b3I6aCx0eXBlOiJfc3ludGgiLGZuOmwsY2FwdHVyZTohMSxyZWdpc3RlcjpmdW5jdGlvbihlKXtlLmV2dC5yZWdpc3RyeT10aGlzLHRoaXMuaGFuZGxlcy5wdXNoKGUpfSx1bnJlZ2lzdGVyOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuaGFuZGxlcyxpPXJbdGhpcy5kb21rZXldLHM7Zm9yKHM9bi5sZW5ndGgtMTtzPj0wOy0tcylpZihuW3NdLnN1Yj09PXQpe24uc3BsaWNlKHMsMSk7YnJlYWt9bi5sZW5ndGh8fChkZWxldGUgaVt0aGlzLmtleV0sZS5PYmplY3Quc2l6ZShpKXx8ZGVsZXRlIHJbdGhpcy5kb21rZXldKX0sZGV0YWNoQWxsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oYW5kbGVzLHQ9ZS5sZW5ndGg7d2hpbGUoLS10Pj0wKWVbdF0uZGV0YWNoKCl9fSxlLm1peChwLHtOb3RpZmllcjpjLFN5bnRoUmVnaXN0cnk6aCxnZXRSZWdpc3RyeTpmdW5jdGlvbih0LG4saSl7dmFyIHM9dC5fbm9kZSxvPWUuc3RhbXAocyksdT0iZXZlbnQ6IitvK24rIl9zeW50aCIsYT1yW29dO3JldHVybiBpJiYoYXx8KGE9cltvXT17fSksYVt1XXx8KGFbdV09bmV3IGgocyxvLHUpKSksYSYmYVt1XXx8bnVsbH0sX2RlbGV0ZVN1YjpmdW5jdGlvbihlKXtpZihlJiZlLmZuKXt2YXIgdD10aGlzLmV2ZW50RGVmLHI9ZS5maWx0ZXI/ImRldGFjaERlbGVnYXRlIjoiZGV0YWNoIjt0aGlzLl9zdWJzY3JpYmVycz1bXSxuLmtlZXBEZXByZWNhdGVkU3VicyYmKHRoaXMuc3Vic2NyaWJlcnM9e30pLHRbcl0oZS5ub2RlLGUsdGhpcy5ub3RpZmllcixlLmZpbHRlciksdGhpcy5yZWdpc3RyeS51bnJlZ2lzdGVyKGUpLGRlbGV0ZSBlLmZuLGRlbGV0ZSBlLm5vZGUsZGVsZXRlIGUuY29udGV4dH19LHByb3RvdHlwZTp7Y29uc3RydWN0b3I6cCxfaW5pdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHVibGlzaENvbmZpZ3x8KHRoaXMucHVibGlzaENvbmZpZz17fSk7dGhpcy5lbWl0RmFjYWRlPSJlbWl0RmFjYWRlImluIGU/ZS5lbWl0RmFjYWRlOiEwLGUuZW1pdEZhY2FkZT0hMX0scHJvY2Vzc0FyZ3M6bCxvbjpsLGRldGFjaDpsLGRlbGVnYXRlOmwsZGV0YWNoRGVsZWdhdGU6bCxfb246ZnVuY3Rpb24odCxuKXt2YXIgcj1bXSxzPXQuc2xpY2UoKSxvPXRoaXMucHJvY2Vzc0FyZ3ModCxuKSxhPXRbMl0sbD1uPyJkZWxlZ2F0ZSI6Im9uIixjLGg7cmV0dXJuIGM9dShhKT9mKGEpOmkoYXx8ZS5vbmUoZS5jb25maWcud2luKSksIWMubGVuZ3RoJiZ1KGEpPyhoPWUub24oImF2YWlsYWJsZSIsZnVuY3Rpb24oKXtlLm1peChoLGVbbF0uYXBwbHkoZSxzKSwhMCl9LGEpLGgpOihlLkFycmF5LmVhY2goYyxmdW5jdGlvbihpKXt2YXIgcz10LnNsaWNlKCksdTtpPWUub25lKGkpLGkmJihuJiYodT1zLnNwbGljZSgzLDEpWzBdKSxzLnNwbGljZSgwLDQsc1sxXSxzWzNdKSwoIXRoaXMucHJldmVudER1cHN8fCF0aGlzLmdldFN1YnMoaSx0LG51bGwsITApKSYmci5wdXNoKHRoaXMuX3N1YnNjcmliZShpLGwscyxvLHUpKSl9LHRoaXMpLHIubGVuZ3RoPT09MT9yWzBdOm5ldyBlLkV2ZW50SGFuZGxlKHIpKX0sX3N1YnNjcmliZTpmdW5jdGlvbih0LG4scixpLHMpe3ZhciBvPW5ldyBlLkN1c3RvbUV2ZW50KHRoaXMudHlwZSx0aGlzLnB1Ymxpc2hDb25maWcpLHU9by5vbi5hcHBseShvLHIpLGE9bmV3IGModSx0aGlzLmVtaXRGYWNhZGUpLGY9cC5nZXRSZWdpc3RyeSh0LHRoaXMudHlwZSwhMCksbD11LnN1YjtyZXR1cm4gbC5ub2RlPXQsbC5maWx0ZXI9cyxpJiZ0aGlzLmFwcGx5QXJnRXh0cmFzKGksbCksZS5taXgobyx7ZXZlbnREZWY6dGhpcyxub3RpZmllcjphLGhvc3Q6dCxjdXJyZW50VGFyZ2V0OnQsdGFyZ2V0OnQsZWw6dC5fbm9kZSxfZGVsZXRlOnAuX2RlbGV0ZVN1Yn0sITApLHUubm90aWZpZXI9YSxmLnJlZ2lzdGVyKHUpLHRoaXNbbl0odCxsLGEscyksdX0sYXBwbHlBcmdFeHRyYXM6ZnVuY3Rpb24oZSx0KXt0Ll9leHRyYT1lfSxfZGV0YWNoOmZ1bmN0aW9uKHQpe3ZhciBuPXRbMl0scj11KG4pP2Yobik6aShuKSxzLG8sYSxsLGM7dC5zcGxpY2UoMiwxKTtmb3Iobz0wLGE9ci5sZW5ndGg7bzxhOysrbyl7cz1lLm9uZShyW29dKTtpZihzKXtsPXRoaXMuZ2V0U3VicyhzLHQpO2lmKGwpZm9yKGM9bC5sZW5ndGgtMTtjPj0wOy0tYylsW2NdLmRldGFjaCgpfX19LGdldFN1YnM6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9cC5nZXRSZWdpc3RyeShlLHRoaXMudHlwZSkscz1bXSxvLHUsYSxmO2lmKGkpe289aS5oYW5kbGVzLG58fChuPXRoaXMuc3ViTWF0Y2gpO2Zvcih1PTAsYT1vLmxlbmd0aDt1PGE7Kyt1KXtmPW9bdV07aWYobi5jYWxsKHRoaXMsZi5zdWIsdCkpe2lmKHIpcmV0dXJuIGY7cy5wdXNoKG9bdV0pfX19cmV0dXJuIHMubGVuZ3RoJiZzfSxzdWJNYXRjaDpmdW5jdGlvbihlLHQpe3JldHVybiF0WzFdfHxlLmZuPT09dFsxXX19fSwhMCksZS5TeW50aGV0aWNFdmVudD1wLGUuRXZlbnQuZGVmaW5lPWZ1bmN0aW9uKHQsbixyKXt2YXIgcyxvLGY7dCYmdC50eXBlPyhzPXQscj1uKTpuJiYocz1lLm1lcmdlKHt0eXBlOnR9LG4pKTtpZihzKXtpZihyfHwhZS5Ob2RlLkRPTV9FVkVOVFNbcy50eXBlXSlvPWZ1bmN0aW9uKCl7cC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZXh0ZW5kKG8scCxzKSxmPW5ldyBvLHQ9Zi50eXBlLGUuTm9kZS5ET01fRVZFTlRTW3RdPWUuRW52LmV2dC5wbHVnaW5zW3RdPXtldmVudERlZjpmLG9uOmZ1bmN0aW9uKCl7cmV0dXJuIGYuX29uKGkoYXJndW1lbnRzKSl9LGRlbGVnYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuX29uKGkoYXJndW1lbnRzKSwhMCl9LGRldGFjaDpmdW5jdGlvbigpe3JldHVybiBmLl9kZXRhY2goaShhcmd1bWVudHMpKX19fWVsc2UodSh0KXx8YSh0KSkmJmUuQXJyYXkuZWFjaChpKHQpLGZ1bmN0aW9uKHQpe2UuTm9kZS5ET01fRVZFTlRTW3RdPTF9KTtyZXR1cm4gZn19LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUtYmFzZSIsImV2ZW50LWN1c3RvbS1jb21wbGV4Il19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImF0dHJpYnV0ZS1jb21wbGV4IixmdW5jdGlvbihlLHQpe3ZhciBuPWUuQXR0cmlidXRlO24uQ29tcGxleD1mdW5jdGlvbigpe30sbi5Db21wbGV4LnByb3RvdHlwZT17X25vcm1BdHRyVmFsczpuLnByb3RvdHlwZS5fbm9ybUF0dHJWYWxzLF9nZXRBdHRySW5pdFZhbDpuLnByb3RvdHlwZS5fZ2V0QXR0ckluaXRWYWx9LGUuQXR0cmlidXRlQ29tcGxleD1uLkNvbXBsZXh9LCIzLjE3LjIiLHtyZXF1aXJlczpbImF0dHJpYnV0ZS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LW1vdXNlZW50ZXIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5FbnYuZXZ0LmRvbV93cmFwcGVycyxyPWUuRE9NLmNvbnRhaW5zLGk9ZS5BcnJheSxzPWZ1bmN0aW9uKCl7fSxvPXtwcm94eVR5cGU6Im1vdXNlb3ZlciIscmVsUHJvcGVydHk6ImZyb21FbGVtZW50Iixfbm90aWZ5OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbz10aGlzLl9ub2RlLHU9dC5yZWxhdGVkVGFyZ2V0fHx0W2ldO28hPT11JiYhcihvLHUpJiZzLmZpcmUobmV3IGUuRE9NRXZlbnRGYWNhZGUodCxvLG5bImV2ZW50OiIrZS5zdGFtcChvKSt0LnR5cGVdKSl9LG9uOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLk5vZGUuZ2V0RE9NTm9kZSh0KSxzPVt0aGlzLnByb3h5VHlwZSx0aGlzLl9ub3RpZnksaSxudWxsLHRoaXMucmVsUHJvcGVydHkscl07bi5oYW5kbGU9ZS5FdmVudC5fYXR0YWNoKHMse2ZhY2FkZTohMX0pfSxkZXRhY2g6ZnVuY3Rpb24oZSx0KXt0LmhhbmRsZS5kZXRhY2goKX0sZGVsZWdhdGU6ZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89ZS5Ob2RlLmdldERPTU5vZGUodCksdT1bdGhpcy5wcm94eVR5cGUscyxvLG51bGwscl07bi5oYW5kbGU9ZS5FdmVudC5fYXR0YWNoKHUse2ZhY2FkZTohMX0pLG4uaGFuZGxlLnN1Yi5maWx0ZXI9aSxuLmhhbmRsZS5zdWIucmVsUHJvcGVydHk9dGhpcy5yZWxQcm9wZXJ0eSxuLmhhbmRsZS5zdWIuX25vdGlmeT10aGlzLl9maWx0ZXJOb3RpZnl9LF9maWx0ZXJOb3RpZnk6ZnVuY3Rpb24odCxuLHMpe249bi5zbGljZSgpLHRoaXMuYXJncyYmbi5wdXNoLmFwcGx5KG4sdGhpcy5hcmdzKTt2YXIgbz1lLmRlbGVnYXRlLl9hcHBseUZpbHRlcih0aGlzLmZpbHRlcixuLHMpLHU9blswXS5yZWxhdGVkVGFyZ2V0fHxuWzBdW3RoaXMucmVsUHJvcGVydHldLGEsZixsLGMsaDtpZihvKXtvPWkobyk7Zm9yKGY9MCxsPW8ubGVuZ3RoJiYoIWF8fCFhLnN0b3BwZWQpO2Y8bDsrK2Ype2g9b1swXTtpZighcihoLHUpKXthfHwoYT1uZXcgZS5ET01FdmVudEZhY2FkZShuWzBdLGgscyksYS5jb250YWluZXI9ZS5vbmUocy5lbCkpLGEuY3VycmVudFRhcmdldD1lLm9uZShoKSxjPW5bMV0uZmlyZShhKTtpZihjPT09ITEpYnJlYWt9fX1yZXR1cm4gY30sZGV0YWNoRGVsZWdhdGU6ZnVuY3Rpb24oZSx0KXt0LmhhbmRsZS5kZXRhY2goKX19O2UuRXZlbnQuZGVmaW5lKCJtb3VzZWVudGVyIixvLCEwKSxlLkV2ZW50LmRlZmluZSgibW91c2VsZWF2ZSIsZS5tZXJnZShvLHtwcm94eVR5cGU6Im1vdXNlb3V0IixyZWxQcm9wZXJ0eToidG9FbGVtZW50In0pLCEwKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LWtleSIsZnVuY3Rpb24oZSx0KXt2YXIgbj0iK2FsdCIscj0iK2N0cmwiLGk9IittZXRhIixzPSIrc2hpZnQiLG89ZS5MYW5nLnRyaW0sdT17S0VZX01BUDp7ZW50ZXI6MTMsc3BhY2U6MzIsZXNjOjI3LGJhY2tzcGFjZTo4LHRhYjo5LHBhZ2V1cDozMyxwYWdlZG93bjozNH0sX3R5cGVSRTovXih1cHxkb3dufHByZXNzKTovLF9rZXlzUkU6L14oPzp1cHxkb3dufHByZXNzKTp8XCsoYWx0fGN0cmx8bWV0YXxzaGlmdCkvZyxwcm9jZXNzQXJnczpmdW5jdGlvbih0KXt2YXIgbj10LnNwbGljZSgzLDEpWzBdLHI9ZS5BcnJheS5oYXNoKG4ubWF0Y2goL1wrKD86YWx0fGN0cmx8bWV0YXxzaGlmdClcYi9nKXx8W10pLGk9e3R5cGU6dGhpcy5fdHlwZVJFLnRlc3Qobik/UmVnRXhwLiQxOm51bGwsbW9kczpyLGtleXM6bnVsbH0scz1uLnJlcGxhY2UodGhpcy5fa2V5c1JFLCIiKSx1LGEsZixsO2lmKHMpe3M9cy5zcGxpdCgiLCIpLGkua2V5cz17fTtmb3IobD1zLmxlbmd0aC0xO2w+PTA7LS1sKXt1PW8oc1tsXSk7aWYoIXUpY29udGludWU7K3U9PXU/aS5rZXlzW3VdPXI6KGY9dS50b0xvd2VyQ2FzZSgpLHRoaXMuS0VZX01BUFtmXT8oaS5rZXlzW3RoaXMuS0VZX01BUFtmXV09cixpLnR5cGV8fChpLnR5cGU9ImRvd24iKSk6KHU9dS5jaGFyQXQoMCksYT11LnRvVXBwZXJDYXNlKCksclsiK3NoaWZ0Il0mJih1PWEpLGkua2V5c1t1LmNoYXJDb2RlQXQoMCldPXU9PT1hP2UubWVyZ2Uocix7IitzaGlmdCI6ITB9KTpyKSl9fXJldHVybiBpLnR5cGV8fChpLnR5cGU9InByZXNzIiksaX0sb246ZnVuY3Rpb24oZSx0LG8sdSl7dmFyIGE9dC5fZXh0cmEsZj0ia2V5IithLnR5cGUsbD1hLmtleXMsYz11PyJkZWxlZ2F0ZSI6Im9uIjt0Ll9kZXRhY2g9ZVtjXShmLGZ1bmN0aW9uKGUpe3ZhciB0PWw/bFtlLndoaWNoXTphLm1vZHM7dCYmKCF0W25dfHx0W25dJiZlLmFsdEtleSkmJighdFtyXXx8dFtyXSYmZS5jdHJsS2V5KSYmKCF0W2ldfHx0W2ldJiZlLm1ldGFLZXkpJiYoIXRbc118fHRbc10mJmUuc2hpZnRLZXkpJiZvLmZpcmUoZSl9LHUpfSxkZXRhY2g6ZnVuY3Rpb24oZSx0LG4pe3QuX2RldGFjaC5kZXRhY2goKX19O3UuZGVsZWdhdGU9dS5vbix1LmRldGFjaERlbGVnYXRlPXUuZGV0YWNoLGUuRXZlbnQuZGVmaW5lKCJrZXkiLHUsITApfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJldmVudC1zeW50aGV0aWMiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiZXZlbnQtb3V0c2lkZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1bImJsdXIiLCJjaGFuZ2UiLCJjbGljayIsImRibGNsaWNrIiwiZm9jdXMiLCJrZXlkb3duIiwia2V5cHJlc3MiLCJrZXl1cCIsIm1vdXNlZG93biIsIm1vdXNlbW92ZSIsIm1vdXNlb3V0IiwibW91c2VvdmVyIiwibW91c2V1cCIsInNlbGVjdCIsInN1Ym1pdCJdO2UuRXZlbnQuZGVmaW5lT3V0c2lkZT1mdW5jdGlvbih0LG4pe249bnx8dCsib3V0c2lkZSI7dmFyIHI9e29uOmZ1bmN0aW9uKG4scixpKXtyLmhhbmRsZT1lLm9uZSgiZG9jIikub24odCxmdW5jdGlvbihlKXt0aGlzLmlzT3V0c2lkZShuLGUudGFyZ2V0KSYmKGUuY3VycmVudFRhcmdldD1uLGkuZmlyZShlKSl9LHRoaXMpfSxkZXRhY2g6ZnVuY3Rpb24oZSx0LG4pe3QuaGFuZGxlLmRldGFjaCgpfSxkZWxlZ2F0ZTpmdW5jdGlvbihuLHIsaSxzKXtyLmhhbmRsZT1lLm9uZSgiZG9jIikuZGVsZWdhdGUodCxmdW5jdGlvbihlKXt0aGlzLmlzT3V0c2lkZShuLGUudGFyZ2V0KSYmaS5maXJlKGUpfSxzLHRoaXMpfSxpc091dHNpZGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCE9PWUmJiF0LmFuY2VzdG9yKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZX0pfX07ci5kZXRhY2hEZWxlZ2F0ZT1yLmRldGFjaCxlLkV2ZW50LmRlZmluZShuLHIpfSxlLkFycmF5LmVhY2gobixmdW5jdGlvbih0KXtlLkV2ZW50LmRlZmluZU91dHNpZGUodCl9KX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImV2ZW50LWZvY3VzIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHUodCxyLHUpe3ZhciBhPSJfIit0KyJOb3RpZmllcnMiO2UuRXZlbnQuZGVmaW5lKHQse191c2VBY3RpdmF0ZTpvLF9hdHRhY2g6ZnVuY3Rpb24oaSxzLG8pe3JldHVybiBlLkRPTS5pc1dpbmRvdyhpKT9uLl9hdHRhY2goW3QsZnVuY3Rpb24oZSl7cy5maXJlKGUpfSxpXSk6bi5fYXR0YWNoKFtyLHRoaXMuX3Byb3h5LGksdGhpcyxzLG9dLHtjYXB0dXJlOiEwfSl9LF9wcm94eTpmdW5jdGlvbih0LHIsaSl7dmFyIHM9dC50YXJnZXQsZj10LmN1cnJlbnRUYXJnZXQsbD1zLmdldERhdGEoYSksYz1lLnN0YW1wKGYuX25vZGUpLGg9b3x8cyE9PWYscDtyLmN1cnJlbnRUYXJnZXQ9aT9zOmYsci5jb250YWluZXI9aT9mOm51bGwsbD9oPSEwOihsPXt9LHMuc2V0RGF0YShhLGwpLGgmJihwPW4uX2F0dGFjaChbdSx0aGlzLl9ub3RpZnkscy5fbm9kZV0pLnN1YixwLm9uY2U9ITApKSxsW2NdfHwobFtjXT1bXSksbFtjXS5wdXNoKHIpLGh8fHRoaXMuX25vdGlmeSh0KX0sX25vdGlmeTpmdW5jdGlvbih0LG4pe3ZhciByPXQuY3VycmVudFRhcmdldCxpPXIuZ2V0RGF0YShhKSxvPXIuYW5jZXN0b3JzKCksdT1yLmdldCgib3duZXJEb2N1bWVudCIpLGY9W10sbD1pP2UuT2JqZWN0LmtleXMoaSkubGVuZ3RoOjAsYyxoLHAsZCx2LG0sZyx5LGIsdztyLmNsZWFyRGF0YShhKSxvLnB1c2gociksdSYmby51bnNoaWZ0KHUpLG8uX25vZGVzLnJldmVyc2UoKSxsJiYobT1sLG8uc29tZShmdW5jdGlvbih0KXt2YXIgbj1lLnN0YW1wKHQpLHI9aVtuXSxzLG87aWYocil7bC0tO2ZvcihzPTAsbz1yLmxlbmd0aDtzPG87KytzKXJbc10uaGFuZGxlLnN1Yi5maWx0ZXImJmYucHVzaChyW3NdKX1yZXR1cm4hbH0pLGw9bSk7d2hpbGUobCYmKGM9by5zaGlmdCgpKSl7ZD1lLnN0YW1wKGMpLGg9aVtkXTtpZihoKXtmb3IoZz0wLHk9aC5sZW5ndGg7Zzx5OysrZyl7cD1oW2ddLGI9cC5oYW5kbGUuc3ViLHY9ITAsdC5jdXJyZW50VGFyZ2V0PWMsYi5maWx0ZXImJih2PWIuZmlsdGVyLmFwcGx5KGMsW2MsdF0uY29uY2F0KGIuYXJnc3x8W10pKSxmLnNwbGljZShzKGYscCksMSkpLHYmJih0LmNvbnRhaW5lcj1wLmNvbnRhaW5lcix3PXAuZmlyZSh0KSk7aWYodz09PSExfHx0LnN0b3BwZWQ9PT0yKWJyZWFrfWRlbGV0ZSBoW2RdLGwtLX1pZih0LnN0b3BwZWQhPT0yKWZvcihnPTAseT1mLmxlbmd0aDtnPHk7KytnKXtwPWZbZ10sYj1wLmhhbmRsZS5zdWIsYi5maWx0ZXIuYXBwbHkoYyxbYyx0XS5jb25jYXQoYi5hcmdzfHxbXSkpJiYodC5jb250YWluZXI9cC5jb250YWluZXIsdC5jdXJyZW50VGFyZ2V0PWMsdz1wLmZpcmUodCkpO2lmKHc9PT0hMXx8dC5zdG9wcGVkPT09Mnx8dC5zdG9wcGVkJiZmW2crMV0mJmZbZysxXS5jb250YWluZXIhPT1wLmNvbnRhaW5lcilicmVha31pZih0LnN0b3BwZWQpYnJlYWt9fSxvbjpmdW5jdGlvbihlLHQsbil7dC5oYW5kbGU9dGhpcy5fYXR0YWNoKGUuX25vZGUsbil9LGRldGFjaDpmdW5jdGlvbihlLHQpe3QuaGFuZGxlLmRldGFjaCgpfSxkZWxlZ2F0ZTpmdW5jdGlvbih0LG4scixzKXtpKHMpJiYobi5maWx0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGUuU2VsZWN0b3IudGVzdChuLl9ub2RlLHMsdD09PW4/bnVsbDp0Ll9ub2RlKX0pLG4uaGFuZGxlPXRoaXMuX2F0dGFjaCh0Ll9ub2RlLHIsITApfSxkZXRhY2hEZWxlZ2F0ZTpmdW5jdGlvbihlLHQpe3QuaGFuZGxlLmRldGFjaCgpfX0sITApfXZhciBuPWUuRXZlbnQscj1lLkxhbmcsaT1yLmlzU3RyaW5nLHM9ZS5BcnJheS5pbmRleE9mLG89ZnVuY3Rpb24oKXt2YXIgdD0hMSxuPWUuY29uZmlnLmRvYyxyO3JldHVybiBuJiYocj1uLmNyZWF0ZUVsZW1lbnQoInAiKSxyLnNldEF0dHJpYnV0ZSgib25iZWZvcmVhY3RpdmF0ZSIsIjsiKSx0PXIub25iZWZvcmVhY3RpdmF0ZSE9PXVuZGVmaW5lZCksdH0oKTtvPyh1KCJmb2N1cyIsImJlZm9yZWFjdGl2YXRlIiwiZm9jdXNpbiIpLHUoImJsdXIiLCJiZWZvcmVkZWFjdGl2YXRlIiwiZm9jdXNvdXQiKSk6KHUoImZvY3VzIiwiZm9jdXMiLCJmb2N1cyIpLHUoImJsdXIiLCJibHVyIiwiYmx1ciIpKX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZXZlbnQtc3ludGhldGljIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoImNsYXNzbmFtZW1hbmFnZXIiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ImNsYXNzTmFtZVByZWZpeCIscj0iY2xhc3NOYW1lRGVsaW1pdGVyIixpPWUuY29uZmlnO2lbbl09aVtuXXx8Inl1aTMiLGlbcl09aVtyXXx8Ii0iLGUuQ2xhc3NOYW1lTWFuYWdlcj1mdW5jdGlvbigpe3ZhciB0PWlbbl0scz1pW3JdO3JldHVybntnZXRDbGFzc05hbWU6ZS5jYWNoZWQoZnVuY3Rpb24oKXt2YXIgbj1lLkFycmF5KGFyZ3VtZW50cyk7cmV0dXJuIG5bbi5sZW5ndGgtMV0hPT0hMD9uLnVuc2hpZnQodCk6bi5wb3AoKSxuLmpvaW4ocyl9KX19KCl9LCIzLjE3LjIiLHtyZXF1aXJlczpbInl1aS1iYXNlIl19KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIndpZGdldC1iYXNlIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIFIoZSl7dmFyIHQ9dGhpcyxuLHIsaT10LmNvbnN0cnVjdG9yO3QuX3N0cnM9e30sdC5fY3NzUHJlZml4PWkuQ1NTX1BSRUZJWHx8cyhpLk5BTUUudG9Mb3dlckNhc2UoKSksZT1lfHx7fSxSLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0LGUpLHI9dC5nZXQoVCksciYmKHIhPT1QJiYobj1yKSx0LnJlbmRlcihuKSl9dmFyIG49ZS5MYW5nLHI9ZS5Ob2RlLGk9ZS5DbGFzc05hbWVNYW5hZ2VyLHM9aS5nZXRDbGFzc05hbWUsbyx1PWUuY2FjaGVkKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSl9KSxhPSJjb250ZW50IixmPSJ2aXNpYmxlIixsPSJoaWRkZW4iLGM9ImRpc2FibGVkIixoPSJmb2N1c2VkIixwPSJ3aWR0aCIsZD0iaGVpZ2h0Iix2PSJib3VuZGluZ0JveCIsbT0iY29udGVudEJveCIsZz0icGFyZW50Tm9kZSIseT0ib3duZXJEb2N1bWVudCIsYj0iYXV0byIsdz0ic3JjTm9kZSIsRT0iYm9keSIsUz0idGFiSW5kZXgiLHg9ImlkIixUPSJyZW5kZXIiLE49InJlbmRlcmVkIixDPSJkZXN0cm95ZWQiLGs9InN0cmluZ3MiLEw9IjxkaXY+PC9kaXY+IixBPSJDaGFuZ2UiLE89ImxvYWRpbmciLE09Il91aVNldCIsXz0iIixEPWZ1bmN0aW9uKCl7fSxQPSEwLEg9ITEsQixqPXt9LEY9W2YsYyxkLHAsaCxTXSxJPWUuVUEud2Via2l0LHE9e307Ui5OQU1FPSJ3aWRnZXQiLEI9Ui5VSV9TUkM9InVpIixSLkFUVFJTPWosalt4XT17dmFsdWVGbjoiX2d1aWQiLHdyaXRlT25jZTpQfSxqW05dPXt2YWx1ZTpILHJlYWRPbmx5OlB9LGpbdl09e3ZhbHVlRm46Il9kZWZhdWx0QkIiLHNldHRlcjoiX3NldEJCIix3cml0ZU9uY2U6UH0salttXT17dmFsdWVGbjoiX2RlZmF1bHRDQiIsc2V0dGVyOiJfc2V0Q0IiLHdyaXRlT25jZTpQfSxqW1NdPXt2YWx1ZTpudWxsLHZhbGlkYXRvcjoiX3ZhbGlkVGFiSW5kZXgifSxqW2hdPXt2YWx1ZTpILHJlYWRPbmx5OlB9LGpbY109e3ZhbHVlOkh9LGpbZl09e3ZhbHVlOlB9LGpbZF09e3ZhbHVlOl99LGpbcF09e3ZhbHVlOl99LGpba109e3ZhbHVlOnt9LHNldHRlcjoiX3N0clNldHRlciIsZ2V0dGVyOiJfc3RyR2V0dGVyIn0saltUXT17dmFsdWU6SCx3cml0ZU9uY2U6UH0sUi5DU1NfUFJFRklYPXMoUi5OQU1FLnRvTG93ZXJDYXNlKCkpLFIuZ2V0Q2xhc3NOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHMuYXBwbHkoaSxbUi5DU1NfUFJFRklYXS5jb25jYXQoZS5BcnJheShhcmd1bWVudHMpLCEwKSl9LG89Ui5nZXRDbGFzc05hbWUsUi5nZXRCeU5vZGU9ZnVuY3Rpb24odCl7dmFyIG4saT1vKCk7cmV0dXJuIHQ9ci5vbmUodCksdCYmKHQ9dC5hbmNlc3RvcigiLiIraSwhMCksdCYmKG49cVtlLnN0YW1wKHQsITApXSkpLG58fG51bGx9LGUuZXh0ZW5kKFIsZS5CYXNlLHtnZXRDbGFzc05hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gcy5hcHBseShpLFt0aGlzLl9jc3NQcmVmaXhdLmNvbmNhdChlLkFycmF5KGFyZ3VtZW50cyksITApKX0saW5pdGlhbGl6ZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5nZXQodik7biBpbnN0YW5jZW9mIHImJnRoaXMuX21hcEluc3RhbmNlKGUuc3RhbXAobikpfSxfbWFwSW5zdGFuY2U6ZnVuY3Rpb24oZSl7cVtlXT10aGlzfSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQodiksbjt0IGluc3RhbmNlb2YgciYmKG49ZS5zdGFtcCh0LCEwKSxuIGluIHEmJmRlbGV0ZSBxW25dLHRoaXMuX2Rlc3Ryb3lCb3goKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2Rlc3Ryb3lBbGxOb2Rlcz1lLFIuc3VwZXJjbGFzcy5kZXN0cm95LmFwcGx5KHRoaXMpfSxfZGVzdHJveUJveDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHYpLHQ9dGhpcy5nZXQobSksbj10aGlzLl9kZXN0cm95QWxsTm9kZXMscjtyPWUmJmUuY29tcGFyZVRvKHQpLHRoaXMuVUlfRVZFTlRTJiZ0aGlzLl9kZXN0cm95VUlFdmVudHMoKSx0aGlzLl91bmJpbmRVSShlKSx0JiYobiYmdC5lbXB0eSgpLHQucmVtb3ZlKFApKSxyfHwobiYmZS5lbXB0eSgpLGUucmVtb3ZlKFApKX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiF0aGlzLmdldChDKSYmIXRoaXMuZ2V0KE4pJiYodGhpcy5wdWJsaXNoKFQse3F1ZXVhYmxlOkgsZmlyZU9uY2U6UCxkZWZhdWx0VGFyZ2V0T25seTpQLGRlZmF1bHRGbjp0aGlzLl9kZWZSZW5kZXJGbn0pLHRoaXMuZmlyZShULHtwYXJlbnROb2RlOmU/ci5vbmUoZSk6bnVsbH0pKSx0aGlzfSxfZGVmUmVuZGVyRm46ZnVuY3Rpb24oZSl7dGhpcy5fcGFyZW50Tm9kZT1lLnBhcmVudE5vZGUsdGhpcy5yZW5kZXJlcigpLHRoaXMuX3NldChOLFApLHRoaXMuX3JlbW92ZUxvYWRpbmdDbGFzc05hbWVzKCl9LHJlbmRlcmVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLl9yZW5kZXJVSSgpLGUucmVuZGVyVUkoKSxlLl9iaW5kVUkoKSxlLmJpbmRVSSgpLGUuX3N5bmNVSSgpLGUuc3luY1VJKCl9LGJpbmRVSTpELHJlbmRlclVJOkQsc3luY1VJOkQsaGlkZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldChmLEgpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0KGYsUCl9LGZvY3VzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldChoLFApfSxibHVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldChoLEgpfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXQoYyxIKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldChjLFApfSxfdWlTaXplQ0I6ZnVuY3Rpb24oZSl7dGhpcy5nZXQobSkudG9nZ2xlQ2xhc3MobyhhLCJleHBhbmRlZCIpLGUpfSxfcmVuZGVyQm94OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10LmdldChtKSxpPXQuZ2V0KHYpLHM9dC5nZXQodyksbz10LkRFRl9QQVJFTlRfTk9ERSx1PXMmJnMuZ2V0KHkpfHxpLmdldCh5KXx8bi5nZXQoeSk7cyYmIXMuY29tcGFyZVRvKG4pJiYhbi5pbkRvYyh1KSYmcy5yZXBsYWNlKG4pLCFpLmNvbXBhcmVUbyhuLmdldChnKSkmJiFpLmNvbXBhcmVUbyhuKSYmKG4uaW5Eb2ModSkmJm4ucmVwbGFjZShpKSxpLmFwcGVuZENoaWxkKG4pKSxlPWV8fG8mJnIub25lKG8pLGU/ZS5hcHBlbmRDaGlsZChpKTppLmluRG9jKHUpfHxyLm9uZShFKS5pbnNlcnQoaSwwKX0sX3NldEJCOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZXRCb3godGhpcy5nZXQoeCksZSx0aGlzLkJPVU5ESU5HX1RFTVBMQVRFLCEwKX0sX3NldENCOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLkNPTlRFTlRfVEVNUExBVEU9PT1udWxsP3RoaXMuZ2V0KHYpOnRoaXMuX3NldEJveChudWxsLGUsdGhpcy5DT05URU5UX1RFTVBMQVRFLCExKX0sX2RlZmF1bHRCQjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHcpLHQ9dGhpcy5DT05URU5UX1RFTVBMQVRFPT09bnVsbDtyZXR1cm4gZSYmdD9lOm51bGx9LF9kZWZhdWx0Q0I6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0KHcpfHxudWxsfSxfc2V0Qm94OmZ1bmN0aW9uKHQsbixpLHMpe3JldHVybiBuPXIub25lKG4pLG58fChuPXIuY3JlYXRlKGkpLHM/dGhpcy5fYmJGcm9tVGVtcGxhdGU9ITA6dGhpcy5fY2JGcm9tVGVtcGxhdGU9ITApLG4uZ2V0KHgpfHxuLnNldCh4LHR8fGUuZ3VpZCgpKSxufSxfcmVuZGVyVUk6ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJCb3hDbGFzc05hbWVzKCksdGhpcy5fcmVuZGVyQm94KHRoaXMuX3BhcmVudE5vZGUpfSxfcmVuZGVyQm94Q2xhc3NOYW1lczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2dldENsYXNzZXMoKSx0LG49dGhpcy5nZXQodikscjtuLmFkZENsYXNzKG8oKSk7Zm9yKHI9ZS5sZW5ndGgtMztyPj0wO3ItLSl0PWVbcl0sbi5hZGRDbGFzcyh0LkNTU19QUkVGSVh8fHModC5OQU1FLnRvTG93ZXJDYXNlKCkpKTt0aGlzLmdldChtKS5hZGRDbGFzcyh0aGlzLmdldENsYXNzTmFtZShhKSl9LF9yZW1vdmVMb2FkaW5nQ2xhc3NOYW1lczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHYpLHQ9dGhpcy5nZXQobSksbj10aGlzLmdldENsYXNzTmFtZShPKSxyPW8oTyk7ZS5yZW1vdmVDbGFzcyhyKS5yZW1vdmVDbGFzcyhuKSx0LnJlbW92ZUNsYXNzKHIpLnJlbW92ZUNsYXNzKG4pfSxfYmluZFVJOmZ1bmN0aW9uKCl7dGhpcy5fYmluZEF0dHJVSSh0aGlzLl9VSV9BVFRSUy5CSU5EKSx0aGlzLl9iaW5kRE9NKCl9LF91bmJpbmRVSTpmdW5jdGlvbihlKXt0aGlzLl91bmJpbmRET00oZSl9LF9iaW5kRE9NOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQodikuZ2V0KHkpLG49Ui5faERvY0ZvY3VzO258fChuPVIuX2hEb2NGb2N1cz10Lm9uKCJmb2N1cyIsdGhpcy5fb25Eb2NGb2N1cyx0aGlzKSxuLmxpc3RlbmVycz17Y291bnQ6MH0pLG4ubGlzdGVuZXJzW2Uuc3RhbXAodGhpcywhMCldPSEwLG4ubGlzdGVuZXJzLmNvdW50KyssSSYmKHRoaXMuX2hEb2NNb3VzZURvd249dC5vbigibW91c2Vkb3duIix0aGlzLl9vbkRvY01vdXNlRG93bix0aGlzKSl9LF91bmJpbmRET006ZnVuY3Rpb24odCl7dmFyIG49Ui5faERvY0ZvY3VzLHI9ZS5zdGFtcCh0aGlzLCEwKSxpLHM9dGhpcy5faERvY01vdXNlRG93bjtuJiYoaT1uLmxpc3RlbmVycyxpW3JdJiYoZGVsZXRlIGlbcl0saS5jb3VudC0tKSxpLmNvdW50PT09MCYmKG4uZGV0YWNoKCksUi5faERvY0ZvY3VzPW51bGwpKSxJJiZzJiZzLmRldGFjaCgpfSxfc3luY1VJOmZ1bmN0aW9uKCl7dGhpcy5fc3luY0F0dHJVSSh0aGlzLl9VSV9BVFRSUy5TWU5DKX0sX3VpU2V0SGVpZ2h0OmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0RGltKGQsZSksdGhpcy5fdWlTaXplQ0IoZSE9PV8mJmUhPT1iKX0sX3VpU2V0V2lkdGg6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXREaW0ocCxlKX0sX3VpU2V0RGltOmZ1bmN0aW9uKGUsdCl7dGhpcy5nZXQodikuc2V0U3R5bGUoZSxuLmlzTnVtYmVyKHQpP3QrdGhpcy5ERUZfVU5JVDp0KX0sX3VpU2V0VmlzaWJsZTpmdW5jdGlvbihlKXt0aGlzLmdldCh2KS50b2dnbGVDbGFzcyh0aGlzLmdldENsYXNzTmFtZShsKSwhZSl9LF91aVNldERpc2FibGVkOmZ1bmN0aW9uKGUpe3RoaXMuZ2V0KHYpLnRvZ2dsZUNsYXNzKHRoaXMuZ2V0Q2xhc3NOYW1lKGMpLGUpfSxfdWlTZXRGb2N1c2VkOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXQodik7bi50b2dnbGVDbGFzcyh0aGlzLmdldENsYXNzTmFtZShoKSxlKSx0IT09QiYmKGU/bi5mb2N1cygpOm4uYmx1cigpKX0sX3VpU2V0VGFiSW5kZXg6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXQodik7bi5pc051bWJlcihlKT90LnNldChTLGUpOnQucmVtb3ZlQXR0cmlidXRlKFMpfSxfb25Eb2NNb3VzZURvd246ZnVuY3Rpb24oZSl7dGhpcy5fZG9tRm9jdXMmJnRoaXMuX29uRG9jRm9jdXMoZSl9LF9vbkRvY0ZvY3VzOmZ1bmN0aW9uKGUpe3ZhciB0PVIuZ2V0QnlOb2RlKGUudGFyZ2V0KSxuPVIuX2FjdGl2ZTtuJiZuIT09dCYmKG4uX2RvbUZvY3VzPSExLG4uX3NldChoLCExLHtzcmM6Qn0pLFIuX2FjdGl2ZT1udWxsKSx0JiYodC5fZG9tRm9jdXM9ITAsdC5fc2V0KGgsITAse3NyYzpCfSksUi5fYWN0aXZlPXQpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIlsiK3RoaXMuZ2V0KHgpKyJdIn0sREVGX1VOSVQ6InB4IixERUZfUEFSRU5UX05PREU6bnVsbCxDT05URU5UX1RFTVBMQVRFOkwsQk9VTkRJTkdfVEVNUExBVEU6TCxfZ3VpZDpmdW5jdGlvbigpe3JldHVybiBlLmd1aWQoKX0sX3ZhbGlkVGFiSW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIG4uaXNOdW1iZXIoZSl8fG4uaXNOdWxsKGUpfSxfYmluZEF0dHJVSTpmdW5jdGlvbihlKXt2YXIgdCxuPWUubGVuZ3RoO2Zvcih0PTA7dDxuO3QrKyl0aGlzLmFmdGVyKGVbdF0rQSx0aGlzLl9zZXRBdHRyVUkpfSxfc3luY0F0dHJVSTpmdW5jdGlvbihlKXt2YXIgdCxuPWUubGVuZ3RoLHI7Zm9yKHQ9MDt0PG47dCsrKXI9ZVt0XSx0aGlzW00rdShyKV0odGhpcy5nZXQocikpfSxfc2V0QXR0clVJOmZ1bmN0aW9uKGUpe2UudGFyZ2V0PT09dGhpcyYmdGhpc1tNK3UoZS5hdHRyTmFtZQopXShlLm5ld1ZhbCxlLnNyYyl9LF9zdHJTZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGUubWVyZ2UodGhpcy5nZXQoayksdCl9LGdldFN0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXQoaylbZV19LGdldFN0cmluZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoayl9LF9VSV9BVFRSUzp7QklORDpGLFNZTkM6Rn19KSxlLldpZGdldD1SfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJhdHRyaWJ1dGUiLCJiYXNlLWJhc2UiLCJiYXNlLXBsdWdpbmhvc3QiLCJjbGFzc25hbWVtYW5hZ2VyIiwiZXZlbnQtZm9jdXMiLCJub2RlLWJhc2UiLCJub2RlLXN0eWxlIl0sc2tpbm5hYmxlOiEwfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtaHRtbHBhcnNlciIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLldpZGdldCxyPWUuTm9kZSxpPWUuTGFuZyxzPSJzcmNOb2RlIixvPSJjb250ZW50Qm94IjtuLkhUTUxfUEFSU0VSPXt9LG4uX2J1aWxkQ2ZnPXthZ2dyZWdhdGVzOlsiSFRNTF9QQVJTRVIiXX0sbi5BVFRSU1tzXT17dmFsdWU6bnVsbCxzZXR0ZXI6ci5vbmUsZ2V0dGVyOiJfZ2V0U3JjTm9kZSIsd3JpdGVPbmNlOiEwfSxlLm1peChuLnByb3RvdHlwZSx7X2dldFNyY05vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGV8fHRoaXMuZ2V0KG8pfSxfcHJlQWRkQXR0cnM6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXtpZDplLmlkLGJvdW5kaW5nQm94OmUuYm91bmRpbmdCb3gsY29udGVudEJveDplLmNvbnRlbnRCb3gsc3JjTm9kZTplLnNyY05vZGV9O3RoaXMuYWRkQXR0cnMocix0LG4pLGRlbGV0ZSBlLmJvdW5kaW5nQm94LGRlbGV0ZSBlLmNvbnRlbnRCb3gsZGVsZXRlIGUuc3JjTm9kZSxkZWxldGUgZS5pZCx0aGlzLl9hcHBseVBhcnNlciYmdGhpcy5fYXBwbHlQYXJzZXIodCl9LF9hcHBseVBhcnNlZENvbmZpZzpmdW5jdGlvbih0LG4scil7cmV0dXJuIHI/ZS5taXgobixyLCExKTpufSxfYXBwbHlQYXJzZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPXRoaXMuX2dldE5vZGVUb1BhcnNlKCkscz1uLl9nZXRIdG1sUGFyc2VyKCksbyx1O3MmJnImJmUuT2JqZWN0LmVhY2gocyxmdW5jdGlvbihlLHQscyl7dT1udWxsLGkuaXNGdW5jdGlvbihlKT91PWUuY2FsbChuLHIpOmkuaXNBcnJheShlKT8odT1yLmFsbChlWzBdKSx1LmlzRW1wdHkoKSYmKHU9bnVsbCkpOnU9ci5vbmUoZSksdSE9PW51bGwmJnUhPT11bmRlZmluZWQmJihvPW98fHt9LG9bdF09dSl9KSx0PW4uX2FwcGx5UGFyc2VkQ29uZmlnKHIsdCxvKX0sX2dldE5vZGVUb1BhcnNlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXQoInNyY05vZGUiKTtyZXR1cm4gdGhpcy5fY2JGcm9tVGVtcGxhdGU/bnVsbDplfSxfZ2V0SHRtbFBhcnNlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldENsYXNzZXMoKSxuPXt9LHIsaTtmb3Iocj10Lmxlbmd0aC0xO3I+PTA7ci0tKWk9dFtyXS5IVE1MX1BBUlNFUixpJiZlLm1peChuLGksITApO3JldHVybiBufX0pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ3aWRnZXQtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtc2tpbiIsZnVuY3Rpb24oZSx0KXt2YXIgbj0iYm91bmRpbmdCb3giLHI9ImNvbnRlbnRCb3giLGk9InNraW4iLHM9ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZTtlLldpZGdldC5wcm90b3R5cGUuZ2V0U2tpbk5hbWU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXQocil8fHRoaXMuZ2V0KG4pLG8sdTtyZXR1cm4gZT1lfHxzKGksIiIpLHU9bmV3IFJlZ0V4cCgiXFxiIitlKyIoXFxTKykiKSx0JiZ0LmFuY2VzdG9yKGZ1bmN0aW9uKGUpe3JldHVybiBvPWUuZ2V0KCJjbGFzc05hbWUiKS5tYXRjaCh1KSxvfSksbz9vWzFdOm51bGx9fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ3aWRnZXQtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtdWlldmVudHMiLGZ1bmN0aW9uKGUsdCl7dmFyIG49ImJvdW5kaW5nQm94IixyPWUuV2lkZ2V0LGk9InJlbmRlciIscz1lLkxhbmcsbz0iOiIsdT1lLldpZGdldC5fdWlldnRzPWUuV2lkZ2V0Ll91aWV2dHN8fHt9O2UubWl4KHIucHJvdG90eXBlLHtfZGVzdHJveVVJRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5zdGFtcCh0aGlzLCEwKTtlLmVhY2godSxmdW5jdGlvbihuLHIpe24uaW5zdGFuY2VzW3RdJiYoZGVsZXRlIG4uaW5zdGFuY2VzW3RdLGUuT2JqZWN0LmlzRW1wdHkobi5pbnN0YW5jZXMpJiYobi5oYW5kbGUuZGV0YWNoKCksdVtyXSYmZGVsZXRlIHVbcl0pKX0pfSxVSV9FVkVOVFM6ZS5Ob2RlLkRPTV9FVkVOVFMsX2dldFVJRXZlbnROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KG4pfSxfY3JlYXRlVUlFdmVudDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRVSUV2ZW50Tm9kZSgpLGk9ZS5zdGFtcChuKSt0LHM9dVtpXSxvO3N8fChvPW4uZGVsZWdhdGUodCxmdW5jdGlvbihlKXt2YXIgdD1yLmdldEJ5Tm9kZSh0aGlzKTt0JiZ0Ll9maWx0ZXJVSUV2ZW50KGUpJiZ0LmZpcmUoZS50eXBlLHtkb21FdmVudDplfSl9LCIuIitlLldpZGdldC5nZXRDbGFzc05hbWUoKSksdVtpXT1zPXtpbnN0YW5jZXM6e30saGFuZGxlOm99KSxzLmluc3RhbmNlc1tlLnN0YW1wKHRoaXMpXT0xfSxfZmlsdGVyVUlFdmVudDpmdW5jdGlvbihlKXtyZXR1cm4gZS5jdXJyZW50VGFyZ2V0LmNvbXBhcmVUbyhlLmNvbnRhaW5lcil8fGUuY29udGFpbmVyLmNvbXBhcmVUbyh0aGlzLl9nZXRVSUV2ZW50Tm9kZSgpKX0sX2dldFVJRXZlbnQ6ZnVuY3Rpb24oZSl7aWYocy5pc1N0cmluZyhlKSl7dmFyIHQ9dGhpcy5wYXJzZVR5cGUoZSlbMV0sbixyO3JldHVybiB0JiYobj10LmluZGV4T2Yobyksbj4tMSYmKHQ9dC5zdWJzdHJpbmcobitvLmxlbmd0aCkpLHRoaXMuVUlfRVZFTlRTW3RdJiYocj10KSkscn19LF9pbml0VUlFdmVudDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRVSUV2ZW50KGUpLG49dGhpcy5fdWlFdnRzSW5pdFF1ZXVlfHx7fTt0JiYhblt0XSYmKHRoaXMuX3VpRXZ0c0luaXRRdWV1ZT1uW3RdPTEsdGhpcy5hZnRlcihpLGZ1bmN0aW9uKCl7dGhpcy5fY3JlYXRlVUlFdmVudCh0KSxkZWxldGUgdGhpcy5fdWlFdnRzSW5pdFF1ZXVlW3RdfSkpfSxvbjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faW5pdFVJRXZlbnQoZSksci5zdXBlcmNsYXNzLm9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scHVibGlzaDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2dldFVJRXZlbnQoZSk7cmV0dXJuIG4mJnQmJnQuZGVmYXVsdEZuJiZ0aGlzLl9pbml0VUlFdmVudChuKSxyLnN1cGVyY2xhc3MucHVibGlzaC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSwhMCl9LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUtZXZlbnQtZGVsZWdhdGUiLCJ3aWRnZXQtYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtc3RkbW9kIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIEgoZSl7fXZhciBuPWUuTGFuZyxyPWUuTm9kZSxpPWUuVUEscz1lLldpZGdldCxvPSIiLHU9ImhkIixhPSJiZCIsZj0iZnQiLGw9ImhlYWRlciIsYz0iYm9keSIsaD0iZm9vdGVyIixwPSJmaWxsSGVpZ2h0IixkPSJzdGRtb2QiLHY9Ik5vZGUiLG09IkNvbnRlbnQiLGc9ImZpcnN0Q2hpbGQiLHk9ImNoaWxkTm9kZXMiLGI9Im93bmVyRG9jdW1lbnQiLHc9ImNvbnRlbnRCb3giLEU9ImhlaWdodCIsUz0ib2Zmc2V0SGVpZ2h0Iix4PSJhdXRvIixUPSJoZWFkZXJDb250ZW50Q2hhbmdlIixOPSJib2R5Q29udGVudENoYW5nZSIsQz0iZm9vdGVyQ29udGVudENoYW5nZSIsaz0iZmlsbEhlaWdodENoYW5nZSIsTD0iaGVpZ2h0Q2hhbmdlIixBPSJjb250ZW50VXBkYXRlIixPPSJyZW5kZXJVSSIsTT0iYmluZFVJIixfPSJzeW5jVUkiLEQ9Il9hcHBseVBhcnNlZENvbmZpZyIsUD1lLldpZGdldC5VSV9TUkM7SC5IRUFERVI9bCxILkJPRFk9YyxILkZPT1RFUj1oLEguQUZURVI9ImFmdGVyIixILkJFRk9SRT0iYmVmb3JlIixILlJFUExBQ0U9InJlcGxhY2UiO3ZhciBCPUguSEVBREVSLGo9SC5CT0RZLEY9SC5GT09URVIsST1CK20scT1GK20sUj1qK207SC5BVFRSUz17aGVhZGVyQ29udGVudDp7dmFsdWU6bnVsbH0sZm9vdGVyQ29udGVudDp7dmFsdWU6bnVsbH0sYm9keUNvbnRlbnQ6e3ZhbHVlOm51bGx9LGZpbGxIZWlnaHQ6e3ZhbHVlOkguQk9EWSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlRmlsbEhlaWdodChlKX19fSxILkhUTUxfUEFSU0VSPXtoZWFkZXJDb250ZW50OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wYXJzZVN0ZE1vZEhUTUwoQil9LGJvZHlDb250ZW50OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wYXJzZVN0ZE1vZEhUTUwoail9LGZvb3RlckNvbnRlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3BhcnNlU3RkTW9kSFRNTChGKX19LEguU0VDVElPTl9DTEFTU19OQU1FUz17aGVhZGVyOnMuZ2V0Q2xhc3NOYW1lKHUpLGJvZHk6cy5nZXRDbGFzc05hbWUoYSksZm9vdGVyOnMuZ2V0Q2xhc3NOYW1lKGYpfSxILlRFTVBMQVRFUz17aGVhZGVyOic8ZGl2IGNsYXNzPSInK0guU0VDVElPTl9DTEFTU19OQU1FU1tCXSsnIj48L2Rpdj4nLGJvZHk6JzxkaXYgY2xhc3M9IicrSC5TRUNUSU9OX0NMQVNTX05BTUVTW2pdKyciPjwvZGl2PicsZm9vdGVyOic8ZGl2IGNsYXNzPSInK0guU0VDVElPTl9DTEFTU19OQU1FU1tGXSsnIj48L2Rpdj4nfSxILnByb3RvdHlwZT17aW5pdGlhbGl6ZXI6ZnVuY3Rpb24oKXt0aGlzLl9zdGRNb2ROb2RlPXRoaXMuZ2V0KHcpLGUuYmVmb3JlKHRoaXMuX3JlbmRlclVJU3RkTW9kLHRoaXMsTyksZS5iZWZvcmUodGhpcy5fYmluZFVJU3RkTW9kLHRoaXMsTSksZS5iZWZvcmUodGhpcy5fc3luY1VJU3RkTW9kLHRoaXMsXyl9LF9zeW5jVUlTdGRNb2Q6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9zdGRNb2RQYXJzZWQ7KCFlfHwhZVtJXSkmJnRoaXMuX3VpU2V0U3RkTW9kKEIsdGhpcy5nZXQoSSkpLCghZXx8IWVbUl0pJiZ0aGlzLl91aVNldFN0ZE1vZChqLHRoaXMuZ2V0KFIpKSwoIWV8fCFlW3FdKSYmdGhpcy5fdWlTZXRTdGRNb2QoRix0aGlzLmdldChxKSksdGhpcy5fdWlTZXRGaWxsSGVpZ2h0KHRoaXMuZ2V0KHApKX0sX3JlbmRlclVJU3RkTW9kOmZ1bmN0aW9uKCl7dGhpcy5fc3RkTW9kTm9kZS5hZGRDbGFzcyhzLmdldENsYXNzTmFtZShkKSksdGhpcy5fcmVuZGVyU3RkTW9kU2VjdGlvbnMoKSx0aGlzLmFmdGVyKFQsdGhpcy5fYWZ0ZXJIZWFkZXJDaGFuZ2UpLHRoaXMuYWZ0ZXIoTix0aGlzLl9hZnRlckJvZHlDaGFuZ2UpLHRoaXMuYWZ0ZXIoQyx0aGlzLl9hZnRlckZvb3RlckNoYW5nZSl9LF9yZW5kZXJTdGRNb2RTZWN0aW9uczpmdW5jdGlvbigpe24uaXNWYWx1ZSh0aGlzLmdldChJKSkmJnRoaXMuX3JlbmRlclN0ZE1vZChCKSxuLmlzVmFsdWUodGhpcy5nZXQoUikpJiZ0aGlzLl9yZW5kZXJTdGRNb2Qoaiksbi5pc1ZhbHVlKHRoaXMuZ2V0KHEpKSYmdGhpcy5fcmVuZGVyU3RkTW9kKEYpfSxfYmluZFVJU3RkTW9kOmZ1bmN0aW9uKCl7dGhpcy5hZnRlcihrLHRoaXMuX2FmdGVyRmlsbEhlaWdodENoYW5nZSksdGhpcy5hZnRlcihMLHRoaXMuX2ZpbGxIZWlnaHQpLHRoaXMuYWZ0ZXIoQSx0aGlzLl9maWxsSGVpZ2h0KX0sX2FmdGVySGVhZGVyQ2hhbmdlOmZ1bmN0aW9uKGUpe2Uuc3JjIT09UCYmdGhpcy5fdWlTZXRTdGRNb2QoQixlLm5ld1ZhbCxlLnN0ZE1vZFBvc2l0aW9uKX0sX2FmdGVyQm9keUNoYW5nZTpmdW5jdGlvbihlKXtlLnNyYyE9PVAmJnRoaXMuX3VpU2V0U3RkTW9kKGosZS5uZXdWYWwsZS5zdGRNb2RQb3NpdGlvbil9LF9hZnRlckZvb3RlckNoYW5nZTpmdW5jdGlvbihlKXtlLnNyYyE9PVAmJnRoaXMuX3VpU2V0U3RkTW9kKEYsZS5uZXdWYWwsZS5zdGRNb2RQb3NpdGlvbil9LF9hZnRlckZpbGxIZWlnaHRDaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRGaWxsSGVpZ2h0KGUubmV3VmFsKX0sX3ZhbGlkYXRlRmlsbEhlaWdodDpmdW5jdGlvbihlKXtyZXR1cm4hZXx8ZT09SC5CT0RZfHxlPT1ILkhFQURFUnx8ZT09SC5GT09URVJ9LF91aVNldEZpbGxIZWlnaHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRTdGRNb2ROb2RlKGUpLG49dGhpcy5fY3VyckZpbGxOb2RlO24mJnQhPT1uJiZuLnNldFN0eWxlKEUsbyksdCYmKHRoaXMuX2N1cnJGaWxsTm9kZT10KSx0aGlzLl9maWxsSGVpZ2h0KCl9LF9maWxsSGVpZ2h0OmZ1bmN0aW9uKCl7aWYodGhpcy5nZXQocCkpe3ZhciBlPXRoaXMuZ2V0KEUpO2UhPW8mJmUhPXgmJnRoaXMuZmlsbEhlaWdodCh0aGlzLmdldFN0ZE1vZE5vZGUodGhpcy5nZXQocCkpKX19LF91aVNldFN0ZE1vZDpmdW5jdGlvbihlLHQscil7aWYobi5pc1ZhbHVlKHQpKXt2YXIgaT10aGlzLmdldFN0ZE1vZE5vZGUoZSwhMCk7dGhpcy5fYWRkU3RkTW9kQ29udGVudChpLHQsciksdGhpcy5zZXQoZSttLHRoaXMuX2dldFN0ZE1vZENvbnRlbnQoZSkse3NyYzpQfSl9ZWxzZSB0aGlzLl9lcmFzZVN0ZE1vZChlKTt0aGlzLmZpcmUoQSl9LF9yZW5kZXJTdGRNb2Q6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXQodyksbj10aGlzLl9maW5kU3RkTW9kU2VjdGlvbihlKTtyZXR1cm4gbnx8KG49dGhpcy5fZ2V0U3RkTW9kVGVtcGxhdGUoZSkpLHRoaXMuX2luc2VydFN0ZE1vZFNlY3Rpb24odCxlLG4pLHRoaXNbZSt2XT1uLHRoaXNbZSt2XX0sX2VyYXNlU3RkTW9kOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0U3RkTW9kTm9kZShlKTt0JiYodC5yZW1vdmUoITApLGRlbGV0ZSB0aGlzW2Urdl0pfSxfaW5zZXJ0U3RkTW9kU2VjdGlvbjpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXQoZyk7aWYodD09PUZ8fCFyKWUuYXBwZW5kQ2hpbGQobik7ZWxzZSBpZih0PT09QillLmluc2VydEJlZm9yZShuLHIpO2Vsc2V7dmFyIGk9dGhpc1tGK3ZdO2k/ZS5pbnNlcnRCZWZvcmUobixpKTplLmFwcGVuZENoaWxkKG4pfX0sX2dldFN0ZE1vZFRlbXBsYXRlOmZ1bmN0aW9uKGUpe3JldHVybiByLmNyZWF0ZShILlRFTVBMQVRFU1tlXSx0aGlzLl9zdGRNb2ROb2RlLmdldChiKSl9LF9hZGRTdGRNb2RDb250ZW50OmZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2gobil7Y2FzZSBILkJFRk9SRTpuPTA7YnJlYWs7Y2FzZSBILkFGVEVSOm49dW5kZWZpbmVkO2JyZWFrO2RlZmF1bHQ6bj1ILlJFUExBQ0V9ZS5pbnNlcnQodCxuKX0sX2dldFByZWNpc2VIZWlnaHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZT9lLmdldChTKTowLG49ImdldEJvdW5kaW5nQ2xpZW50UmVjdCI7aWYoZSYmZS5oYXNNZXRob2Qobikpe3ZhciByPWUuaW52b2tlKG4pO3ImJih0PXIuYm90dG9tLXIudG9wKX1yZXR1cm4gdH0sX2ZpbmRTdGRNb2RTZWN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldCh3KS5vbmUoIj4gLiIrSC5TRUNUSU9OX0NMQVNTX05BTUVTW2VdKX0sX3BhcnNlU3RkTW9kSFRNTDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9maW5kU3RkTW9kU2VjdGlvbih0KTtyZXR1cm4gbj8odGhpcy5fc3RkTW9kUGFyc2VkfHwodGhpcy5fc3RkTW9kUGFyc2VkPXt9LGUuYmVmb3JlKHRoaXMuX2FwcGx5U3RkTW9kUGFyc2VkQ29uZmlnLHRoaXMsRCkpLHRoaXMuX3N0ZE1vZFBhcnNlZFt0K21dPTEsbi5nZXQoImlubmVySFRNTCIpKTpudWxsfSxfYXBwbHlTdGRNb2RQYXJzZWRDb25maWc6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX3N0ZE1vZFBhcnNlZDtyJiYocltJXT0hKEkgaW4gdCkmJkkgaW4gcixyW1JdPSEoUiBpbiB0KSYmUiBpbiByLHJbcV09IShxIGluIHQpJiZxIGluIHIpfSxfZ2V0U3RkTW9kQ29udGVudDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpc1tlK3ZdP3RoaXNbZSt2XS5nZXQoeSk6bnVsbH0sc2V0U3RkTW9kQ29udGVudDpmdW5jdGlvbihlLHQsbil7dGhpcy5zZXQoZSttLHQse3N0ZE1vZFBvc2l0aW9uOm59KX0sZ2V0U3RkTW9kTm9kZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbZSt2XXx8bnVsbDtyZXR1cm4hbiYmdCYmKG49dGhpcy5fcmVuZGVyU3RkTW9kKGUpKSxufSxmaWxsSGVpZ2h0OmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PXRoaXMuZ2V0KHcpLHI9W3RoaXMuaGVhZGVyTm9kZSx0aGlzLmJvZHlOb2RlLHRoaXMuZm9vdGVyTm9kZV0scyxvLHU9MCxhPTAsZj0hMTtmb3IodmFyIGw9MCxjPXIubGVuZ3RoO2w8YztsKyspcz1yW2xdLHMmJihzIT09ZT91Kz10aGlzLl9nZXRQcmVjaXNlSGVpZ2h0KHMpOmY9ITApO2YmJigoaS5pZXx8aS5vcGVyYSkmJmUuc2V0KFMsMCksbz10LmdldChTKS1wYXJzZUludCh0LmdldENvbXB1dGVkU3R5bGUoInBhZGRpbmdUb3AiKSwxMCktcGFyc2VJbnQodC5nZXRDb21wdXRlZFN0eWxlKCJwYWRkaW5nQm90dG9tIiksMTApLXBhcnNlSW50KHQuZ2V0Q29tcHV0ZWRTdHlsZSgiYm9yZGVyQm90dG9tV2lkdGgiKSwxMCktcGFyc2VJbnQodC5nZXRDb21wdXRlZFN0eWxlKCJib3JkZXJUb3BXaWR0aCIpLDEwKSxuLmlzTnVtYmVyKG8pJiYoYT1vLXUsYT49MCYmZS5zZXQoUyxhKSkpfX19LGUuV2lkZ2V0U3RkTW9kPUh9LCIzLjE3LjIiLHtyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJ3aWRnZXQiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgid2lkZ2V0LXBvc2l0aW9uIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGQoZSl7fXZhciBuPWUuTGFuZyxyPWUuV2lkZ2V0LGk9Inh5IixzPSJwb3NpdGlvbiIsbz0icG9zaXRpb25lZCIsdT0iYm91bmRpbmdCb3giLGE9InJlbGF0aXZlIixmPSJyZW5kZXJVSSIsbD0iYmluZFVJIixjPSJzeW5jVUkiLGg9ci5VSV9TUkMscD0ieHlDaGFuZ2UiO2QuQVRUUlM9e3g6e3NldHRlcjpmdW5jdGlvbihlKXt0aGlzLl9zZXRYKGUpfSxnZXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0WCgpfSxsYXp5QWRkOiExfSx5OntzZXR0ZXI6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0WShlKX0sZ2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFkoKX0sbGF6eUFkZDohMX0seHk6e3ZhbHVlOlswLDBdLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fdmFsaWRhdGVYWShlKX19fSxkLlBPU0lUSU9ORURfQ0xBU1NfTkFNRT1yLmdldENsYXNzTmFtZShvKSxkLnByb3RvdHlwZT17aW5pdGlhbGl6ZXI6ZnVuY3Rpb24oKXt0aGlzLl9wb3NOb2RlPXRoaXMuZ2V0KHUpLGUuYWZ0ZXIodGhpcy5fcmVuZGVyVUlQb3NpdGlvbix0aGlzLGYpLGUuYWZ0ZXIodGhpcy5fc3luY1VJUG9zaXRpb24sdGhpcyxjKSxlLmFmdGVyKHRoaXMuX2JpbmRVSVBvc2l0aW9uLHRoaXMsbCl9LF9yZW5kZXJVSVBvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fcG9zTm9kZS5hZGRDbGFzcyhkLlBPU0lUSU9ORURfQ0xBU1NfTkFNRSl9LF9zeW5jVUlQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3Bvc05vZGU7ZS5nZXRTdHlsZShzKT09PWEmJnRoaXMuc3luY1hZKCksdGhpcy5fdWlTZXRYWSh0aGlzLmdldChpKSl9LF9iaW5kVUlQb3NpdGlvbjpmdW5jdGlvbigpe3RoaXMuYWZ0ZXIocCx0aGlzLl9hZnRlclhZQ2hhbmdlKX0sbW92ZTpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cyx0PW4uaXNBcnJheShlWzBdKT9lWzBdOltlWzBdLGVbMV1dO3RoaXMuc2V0KGksdCl9LHN5bmNYWTpmdW5jdGlvbigpe3RoaXMuc2V0KGksdGhpcy5fcG9zTm9kZS5nZXRYWSgpLHtzcmM6aH0pfSxfdmFsaWRhdGVYWTpmdW5jdGlvbihlKXtyZXR1cm4gbi5pc0FycmF5KGUpJiZuLmlzTnVtYmVyKGVbMF0pJiZuLmlzTnVtYmVyKGVbMV0pfSxfc2V0WDpmdW5jdGlvbihlKXt0aGlzLnNldChpLFtlLHRoaXMuZ2V0KGkpWzFdXSl9LF9zZXRZOmZ1bmN0aW9uKGUpe3RoaXMuc2V0KGksW3RoaXMuZ2V0KGkpWzBdLGVdKX0sX2dldFg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoaSlbMF19LF9nZXRZOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KGkpWzFdfSxfYWZ0ZXJYWUNoYW5nZTpmdW5jdGlvbihlKXtlLnNyYyE9aCYmdGhpcy5fdWlTZXRYWShlLm5ld1ZhbCl9LF91aVNldFhZOmZ1bmN0aW9uKGUpe3RoaXMuX3Bvc05vZGUuc2V0WFkoZSl9fSxlLldpZGdldFBvc2l0aW9uPWR9LCIzLjE3LjIiLHtyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJub2RlLXNjcmVlbiIsIndpZGdldCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtcG9zaXRpb24tYWxpZ24iLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gYyhlKXt9dmFyIG49ZS5MYW5nLHI9ImFsaWduIixpPSJhbGlnbk9uIixzPSJ2aXNpYmxlIixvPSJib3VuZGluZ0JveCIsdT0ib2Zmc2V0V2lkdGgiLGE9Im9mZnNldEhlaWdodCIsZj0icmVnaW9uIixsPSJ2aWV3cG9ydFJlZ2lvbiI7Yy5BVFRSUz17YWxpZ246e3ZhbHVlOm51bGx9LGNlbnRlcmVkOntzZXR0ZXI6Il9zZXRBbGlnbkNlbnRlciIsbGF6eUFkZDohMSx2YWx1ZTohMX0sYWxpZ25Pbjp7dmFsdWU6W10sdmFsaWRhdG9yOmUuTGFuZy5pc0FycmF5fX0sYy5UTD0idGwiLGMuVFI9InRyIixjLkJMPSJibCIsYy5CUj0iYnIiLGMuVEM9InRjIixjLlJDPSJyYyIsYy5CQz0iYmMiLGMuTEM9ImxjIixjLkNDPSJjYyIsYy5wcm90b3R5cGU9e2luaXRpYWxpemVyOmZ1bmN0aW9uKCl7dGhpcy5fcG9zTm9kZXx8ZS5lcnJvcigiV2lkZ2V0UG9zaXRpb24gbmVlZHMgdG8gYmUgYWRkZWQgdG8gdGhlIFdpZGdldCwgYmVmb3JlIFdpZGdldFBvc2l0aW9uQWxpZ24gaXMgYWRkZWQiKSxlLmFmdGVyKHRoaXMuX2JpbmRVSVBvc0FsaWduLHRoaXMsImJpbmRVSSIpLGUuYWZ0ZXIodGhpcy5fc3luY1VJUG9zQWxpZ24sdGhpcywic3luY1VJIil9LF9wb3NBbGlnblVJSGFuZGxlczpudWxsLGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl9kZXRhY2hQb3NBbGlnblVJSGFuZGxlcygpfSxfYmluZFVJUG9zQWxpZ246ZnVuY3Rpb24oKXt0aGlzLmFmdGVyKCJhbGlnbkNoYW5nZSIsdGhpcy5fYWZ0ZXJBbGlnbkNoYW5nZSksdGhpcy5hZnRlcigiYWxpZ25PbkNoYW5nZSIsdGhpcy5fYWZ0ZXJBbGlnbk9uQ2hhbmdlKSx0aGlzLmFmdGVyKCJ2aXNpYmxlQ2hhbmdlIix0aGlzLl9zeW5jVUlQb3NBbGlnbil9LF9zeW5jVUlQb3NBbGlnbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHIpO3RoaXMuX3VpU2V0VmlzaWJsZVBvc0FsaWduKHRoaXMuZ2V0KHMpKSxlJiZ0aGlzLl91aVNldEFsaWduKGUubm9kZSxlLnBvaW50cyl9LGFsaWduOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5zZXQocix7bm9kZTplLHBvaW50czp0fSk6dGhpcy5fc3luY1VJUG9zQWxpZ24oKSx0aGlzfSxjZW50ZXJlZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hbGlnbihlLFtjLkNDLGMuQ0NdKX0sX3NldEFsaWduQ2VudGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlJiZ0aGlzLnNldChyLHtub2RlOmU9PT0hMD9udWxsOmUscG9pbnRzOltjLkNDLGMuQ0NdfSksZX0sX3VpU2V0QWxpZ246ZnVuY3Rpb24odCxyKXtpZighbi5pc0FycmF5KHIpfHxyLmxlbmd0aCE9PTIpe2UuZXJyb3IoImFsaWduOiBJbnZhbGlkIFBvaW50cyBBcmd1bWVudHMiKTtyZXR1cm59dmFyIGk9dGhpcy5fZ2V0UmVnaW9uKHQpLHMsbyx1O2lmKCFpKXJldHVybjtzPXJbMF0sbz1yWzFdO3N3aXRjaChvKXtjYXNlIGMuVEw6dT1baS5sZWZ0LGkudG9wXTticmVhaztjYXNlIGMuVFI6dT1baS5yaWdodCxpLnRvcF07YnJlYWs7Y2FzZSBjLkJMOnU9W2kubGVmdCxpLmJvdHRvbV07YnJlYWs7Y2FzZSBjLkJSOnU9W2kucmlnaHQsaS5ib3R0b21dO2JyZWFrO2Nhc2UgYy5UQzp1PVtpLmxlZnQrTWF0aC5mbG9vcihpLndpZHRoLzIpLGkudG9wXTticmVhaztjYXNlIGMuQkM6dT1baS5sZWZ0K01hdGguZmxvb3IoaS53aWR0aC8yKSxpLmJvdHRvbV07YnJlYWs7Y2FzZSBjLkxDOnU9W2kubGVmdCxpLnRvcCtNYXRoLmZsb29yKGkuaGVpZ2h0LzIpXTticmVhaztjYXNlIGMuUkM6dT1baS5yaWdodCxpLnRvcCtNYXRoLmZsb29yKGkuaGVpZ2h0LzIpXTticmVhaztjYXNlIGMuQ0M6dT1baS5sZWZ0K01hdGguZmxvb3IoaS53aWR0aC8yKSxpLnRvcCtNYXRoLmZsb29yKGkuaGVpZ2h0LzIpXTticmVhaztkZWZhdWx0On11JiZ0aGlzLl9kb0FsaWduKHMsdVswXSx1WzFdKX0sX3VpU2V0VmlzaWJsZVBvc0FsaWduOmZ1bmN0aW9uKGUpe2U/dGhpcy5fYXR0YWNoUG9zQWxpZ25VSUhhbmRsZXMoKTp0aGlzLl9kZXRhY2hQb3NBbGlnblVJSGFuZGxlcygpfSxfYXR0YWNoUG9zQWxpZ25VSUhhbmRsZXM6ZnVuY3Rpb24oKXtpZih0aGlzLl9wb3NBbGlnblVJSGFuZGxlcylyZXR1cm47dmFyIHQ9dGhpcy5nZXQobyksbj1lLmJpbmQodGhpcy5fc3luY1VJUG9zQWxpZ24sdGhpcykscj1bXTtlLkFycmF5LmVhY2godGhpcy5nZXQoaSksZnVuY3Rpb24oaSl7dmFyIHM9aS5ldmVudE5hbWUsbz1lLm9uZShpLm5vZGUpfHx0O3MmJnIucHVzaChvLm9uKHMsbikpfSksdGhpcy5fcG9zQWxpZ25VSUhhbmRsZXM9cn0sX2RldGFjaFBvc0FsaWduVUlIYW5kbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcG9zQWxpZ25VSUhhbmRsZXM7dCYmKChuZXcgZS5FdmVudEhhbmRsZSh0KSkuZGV0YWNoKCksdGhpcy5fcG9zQWxpZ25VSUhhbmRsZXM9bnVsbCl9LF9kb0FsaWduOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl9wb3NOb2RlLGk7c3dpdGNoKGUpe2Nhc2UgYy5UTDppPVt0LG5dO2JyZWFrO2Nhc2UgYy5UUjppPVt0LXIuZ2V0KHUpLG5dO2JyZWFrO2Nhc2UgYy5CTDppPVt0LG4tci5nZXQoYSldO2JyZWFrO2Nhc2UgYy5CUjppPVt0LXIuZ2V0KHUpLG4tci5nZXQoYSldO2JyZWFrO2Nhc2UgYy5UQzppPVt0LXIuZ2V0KHUpLzIsbl07YnJlYWs7Y2FzZSBjLkJDOmk9W3Qtci5nZXQodSkvMixuLXIuZ2V0KGEpXTticmVhaztjYXNlIGMuTEM6aT1bdCxuLXIuZ2V0KGEpLzJdO2JyZWFrO2Nhc2UgYy5SQzppPVt0LXIuZ2V0KHUpLG4tci5nZXQoYSkvMl07YnJlYWs7Y2FzZSBjLkNDOmk9W3Qtci5nZXQodSkvMixuLXIuZ2V0KGEpLzJdO2JyZWFrO2RlZmF1bHQ6fWkmJnRoaXMubW92ZShpKX0sX2dldFJlZ2lvbjpmdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4gdD8odD1lLk5vZGUub25lKHQpLHQmJihuPXQuZ2V0KGYpKSk6bj10aGlzLl9wb3NOb2RlLmdldChsKSxufSxfYWZ0ZXJBbGlnbkNoYW5nZTpmdW5jdGlvbihlKXt2YXIgdD1lLm5ld1ZhbDt0JiZ0aGlzLl91aVNldEFsaWduKHQubm9kZSx0LnBvaW50cyl9LF9hZnRlckFsaWduT25DaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5fZGV0YWNoUG9zQWxpZ25VSUhhbmRsZXMoKSx0aGlzLmdldChzKSYmdGhpcy5fYXR0YWNoUG9zQWxpZ25VSUhhbmRsZXMoKX19LGUuV2lkZ2V0UG9zaXRpb25BbGlnbj1jfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ3aWRnZXQtcG9zaXRpb24iXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgid2lkZ2V0LXN0YWNrIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIE8oZSl7fXZhciBuPWUuTGFuZyxyPWUuVUEsaT1lLk5vZGUscz1lLldpZGdldCxvPSJ6SW5kZXgiLHU9InNoaW0iLGE9InZpc2libGUiLGY9ImJvdW5kaW5nQm94IixsPSJyZW5kZXJVSSIsYz0iYmluZFVJIixoPSJzeW5jVUkiLHA9Im9mZnNldFdpZHRoIixkPSJvZmZzZXRIZWlnaHQiLHY9InBhcmVudE5vZGUiLG09ImZpcnN0Q2hpbGQiLGc9Im93bmVyRG9jdW1lbnQiLHk9IndpZHRoIixiPSJoZWlnaHQiLHc9InB4IixFPSJzaGltZGVmZXJyZWQiLFM9InNoaW1yZXNpemUiLHg9InZpc2libGVDaGFuZ2UiLFQ9IndpZHRoQ2hhbmdlIixOPSJoZWlnaHRDaGFuZ2UiLEM9InNoaW1DaGFuZ2UiLGs9InpJbmRleENoYW5nZSIsTD0iY29udGVudFVwZGF0ZSIsQT0ic3RhY2tlZCI7Ty5BVFRSUz17c2hpbTp7dmFsdWU6ci5pZT09Nn0sekluZGV4Ont2YWx1ZTowLHNldHRlcjoiX3NldFpJbmRleCJ9fSxPLkhUTUxfUEFSU0VSPXt6SW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3BhcnNlWkluZGV4KGUpfX0sTy5TSElNX0NMQVNTX05BTUU9cy5nZXRDbGFzc05hbWUodSksTy5TVEFDS0VEX0NMQVNTX05BTUU9cy5nZXRDbGFzc05hbWUoQSksTy5TSElNX1RFTVBMQVRFPSc8aWZyYW1lIGNsYXNzPSInK08uU0hJTV9DTEFTU19OQU1FKyciIGZyYW1lYm9yZGVyPSIwIiB0aXRsZT0iV2lkZ2V0IFN0YWNraW5nIFNoaW0iIHNyYz0iamF2YXNjcmlwdDpmYWxzZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJwcmVzZW50YXRpb24iPjwvaWZyYW1lPicsTy5wcm90b3R5cGU9e2luaXRpYWxpemVyOmZ1bmN0aW9uKCl7dGhpcy5fc3RhY2tOb2RlPXRoaXMuZ2V0KGYpLHRoaXMuX3N0YWNrSGFuZGxlcz17fSxlLmFmdGVyKHRoaXMuX3JlbmRlclVJU3RhY2ssdGhpcyxsKSxlLmFmdGVyKHRoaXMuX3N5bmNVSVN0YWNrLHRoaXMsaCksZS5hZnRlcih0aGlzLl9iaW5kVUlTdGFjayx0aGlzLGMpfSxfc3luY1VJU3RhY2s6ZnVuY3Rpb24oKXt0aGlzLl91aVNldFNoaW0odGhpcy5nZXQodSkpLHRoaXMuX3VpU2V0WkluZGV4KHRoaXMuZ2V0KG8pKX0sX2JpbmRVSVN0YWNrOmZ1bmN0aW9uKCl7dGhpcy5hZnRlcihDLHRoaXMuX2FmdGVyU2hpbUNoYW5nZSksdGhpcy5hZnRlcihrLHRoaXMuX2FmdGVyWkluZGV4Q2hhbmdlKX0sX3JlbmRlclVJU3RhY2s6ZnVuY3Rpb24oKXt0aGlzLl9zdGFja05vZGUuYWRkQ2xhc3MoTy5TVEFDS0VEX0NMQVNTX05BTUUpfSxfcGFyc2VaSW5kZXg6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIWUuaW5Eb2MoKXx8ZS5nZXRTdHlsZSgicG9zaXRpb24iKT09PSJzdGF0aWMiP3Q9ImF1dG8iOnQ9ZS5nZXRDb21wdXRlZFN0eWxlKCJ6SW5kZXgiKSx0PT09ImF1dG8iP251bGw6dH0sX3NldFpJbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gbi5pc1N0cmluZyhlKSYmKGU9cGFyc2VJbnQoZSwxMCkpLG4uaXNOdW1iZXIoZSl8fChlPTApLGV9LF9hZnRlclNoaW1DaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRTaGltKGUubmV3VmFsKX0sX2FmdGVyWkluZGV4Q2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0WkluZGV4KGUubmV3VmFsKX0sX3VpU2V0WkluZGV4OmZ1bmN0aW9uKGUpe3RoaXMuX3N0YWNrTm9kZS5zZXRTdHlsZShvLGUpfSxfdWlTZXRTaGltOmZ1bmN0aW9uKGUpe2U/KHRoaXMuZ2V0KGEpP3RoaXMuX3JlbmRlclNoaW0oKTp0aGlzLl9yZW5kZXJTaGltRGVmZXJyZWQoKSxyLmllPT02JiZ0aGlzLl9hZGRTaGltUmVzaXplSGFuZGxlcnMoKSk6dGhpcy5fZGVzdHJveVNoaW0oKX0sX3JlbmRlclNoaW1EZWZlcnJlZDpmdW5jdGlvbigpe3RoaXMuX3N0YWNrSGFuZGxlc1tFXT10aGlzLl9zdGFja0hhbmRsZXNbRV18fFtdO3ZhciBlPXRoaXMuX3N0YWNrSGFuZGxlc1tFXSx0PWZ1bmN0aW9uKGUpe2UubmV3VmFsJiZ0aGlzLl9yZW5kZXJTaGltKCl9O2UucHVzaCh0aGlzLm9uKHgsdCkpfSxfYWRkU2hpbVJlc2l6ZUhhbmRsZXJzOmZ1bmN0aW9uKCl7dGhpcy5fc3RhY2tIYW5kbGVzW1NdPXRoaXMuX3N0YWNrSGFuZGxlc1tTXXx8W107dmFyIGU9dGhpcy5zaXplU2hpbSx0PXRoaXMuX3N0YWNrSGFuZGxlc1tTXTt0LnB1c2godGhpcy5hZnRlcih4LGUpKSx0LnB1c2godGhpcy5hZnRlcihULGUpKSx0LnB1c2godGhpcy5hZnRlcihOLGUpKSx0LnB1c2godGhpcy5hZnRlcihMLGUpKX0sX2RldGFjaFN0YWNrSGFuZGxlczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9zdGFja0hhbmRsZXNbZV0sbjtpZih0JiZ0Lmxlbmd0aD4wKXdoaWxlKG49dC5wb3AoKSluLmRldGFjaCgpfSxfcmVuZGVyU2hpbTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3NoaW1Ob2RlLHQ9dGhpcy5fc3RhY2tOb2RlO2V8fChlPXRoaXMuX3NoaW1Ob2RlPXRoaXMuX2dldFNoaW1UZW1wbGF0ZSgpLHQuaW5zZXJ0QmVmb3JlKGUsdC5nZXQobSkpLHRoaXMuX2RldGFjaFN0YWNrSGFuZGxlcyhFKSx0aGlzLnNpemVTaGltKCkpfSxfZGVzdHJveVNoaW06ZnVuY3Rpb24oKXt0aGlzLl9zaGltTm9kZSYmKHRoaXMuX3NoaW1Ob2RlLmdldCh2KS5yZW1vdmVDaGlsZCh0aGlzLl9zaGltTm9kZSksdGhpcy5fc2hpbU5vZGU9bnVsbCx0aGlzLl9kZXRhY2hTdGFja0hhbmRsZXMoRSksdGhpcy5fZGV0YWNoU3RhY2tIYW5kbGVzKFMpKX0sc2l6ZVNoaW06ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9zaGltTm9kZSx0PXRoaXMuX3N0YWNrTm9kZTtlJiZyLmllPT09NiYmdGhpcy5nZXQoYSkmJihlLnNldFN0eWxlKHksdC5nZXQocCkrdyksZS5zZXRTdHlsZShiLHQuZ2V0KGQpK3cpKX0sX2dldFNoaW1UZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiBpLmNyZWF0ZShPLlNISU1fVEVNUExBVEUsdGhpcy5fc3RhY2tOb2RlLmdldChnKSl9fSxlLldpZGdldFN0YWNrPU99LCIzLjE3LjIiLHtyZXF1aXJlczpbImJhc2UtYnVpbGQiLCJ3aWRnZXQiXSxza2lubmFibGU6ITB9KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoIndpZGdldC1wb3NpdGlvbi1jb25zdHJhaW4iLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbShlKXt9dmFyIG49ImNvbnN0cmFpbiIscj0iY29uc3RyYWlufHh5Q2hhbmdlIixpPSJjb25zdHJhaW5DaGFuZ2UiLHM9InByZXZlbnRPdmVybGFwIixvPSJhbGlnbiIsdT0iIixhPSJiaW5kVUkiLGY9Inh5IixsPSJ4IixjPSJ5IixoPWUuTm9kZSxwPSJ2aWV3cG9ydFJlZ2lvbiIsZD0icmVnaW9uIix2O20uQVRUUlM9e2NvbnN0cmFpbjp7dmFsdWU6bnVsbCxzZXR0ZXI6Il9zZXRDb25zdHJhaW4ifSxwcmV2ZW50T3ZlcmxhcDp7dmFsdWU6ITF9fSx2PW0uX1BSRVZFTlRfT1ZFUkxBUD17eDp7dGx0cjoxLGJsYnI6MSxicmJsOjEsdHJ0bDoxfSx5Ont0cmJyOjEsdGxibDoxLGJsdGw6MSxicnRyOjF9fSxtLnByb3RvdHlwZT17aW5pdGlhbGl6ZXI6ZnVuY3Rpb24oKXt0aGlzLl9wb3NOb2RlfHxlLmVycm9yKCJXaWRnZXRQb3NpdGlvbiBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgV2lkZ2V0LCBiZWZvcmUgV2lkZ2V0UG9zaXRpb25Db25zdHJhaW4gaXMgYWRkZWQiKSxlLmFmdGVyKHRoaXMuX2JpbmRVSVBvc0NvbnN0cmFpbmVkLHRoaXMsYSl9LGdldENvbnN0cmFpbmVkWFk6ZnVuY3Rpb24oZSx0KXt0PXR8fHRoaXMuZ2V0KG4pO3ZhciByPXRoaXMuX2dldFJlZ2lvbih0PT09ITA/bnVsbDp0KSxpPXRoaXMuX3Bvc05vZGUuZ2V0KGQpO3JldHVyblt0aGlzLl9jb25zdHJhaW4oZVswXSxsLGksciksdGhpcy5fY29uc3RyYWluKGVbMV0sYyxpLHIpXX0sY29uc3RyYWluOmZ1bmN0aW9uKGUsdCl7dmFyIHIsaSxzPXR8fHRoaXMuZ2V0KG4pO3MmJihyPWV8fHRoaXMuZ2V0KGYpLGk9dGhpcy5nZXRDb25zdHJhaW5lZFhZKHIscyksKGlbMF0hPT1yWzBdfHxpWzFdIT09clsxXSkmJnRoaXMuc2V0KGYsaSx7Y29uc3RyYWluZWQ6ITB9KSl9LF9zZXRDb25zdHJhaW46ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0hMD9lOmgub25lKGUpfSxfY29uc3RyYWluOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKHIpe3RoaXMuZ2V0KHMpJiYoZT10aGlzLl9wcmV2ZW50T3ZlcmxhcChlLHQsbixyKSk7dmFyIGk9dD09bCxvPWk/ci53aWR0aDpyLmhlaWdodCx1PWk/bi53aWR0aDpuLmhlaWdodCxhPWk/ci5sZWZ0OnIudG9wLGY9aT9yLnJpZ2h0LXU6ci5ib3R0b20tdTtpZihlPGF8fGU+Zil1PG8/ZTxhP2U9YTplPmYmJihlPWYpOmU9YX1yZXR1cm4gZX0sX3ByZXZlbnRPdmVybGFwOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuZ2V0KG8pLHM9dD09PWwsYSxmLGMsaCxwLGQ7cmV0dXJuIGkmJmkucG9pbnRzJiZ2W3RdW2kucG9pbnRzLmpvaW4odSldJiYoZj10aGlzLl9nZXRSZWdpb24oaS5ub2RlKSxmJiYoYT1zP24ud2lkdGg6bi5oZWlnaHQsYz1zP2YubGVmdDpmLnRvcCxoPXM/Zi5yaWdodDpmLmJvdHRvbSxwPXM/Zi5sZWZ0LXIubGVmdDpmLnRvcC1yLnRvcCxkPXM/ci5yaWdodC1mLnJpZ2h0OnIuYm90dG9tLWYuYm90dG9tKSxlPmM/ZDxhJiZwPmEmJihlPWMtYSk6cDxhJiZkPmEmJihlPWgpKSxlfSxfYmluZFVJUG9zQ29uc3RyYWluZWQ6ZnVuY3Rpb24oKXt0aGlzLmFmdGVyKGksdGhpcy5fYWZ0ZXJDb25zdHJhaW5DaGFuZ2UpLHRoaXMuX2VuYWJsZUNvbnN0cmFpbnRzKHRoaXMuZ2V0KG4pKX0sX2FmdGVyQ29uc3RyYWluQ2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMuX2VuYWJsZUNvbnN0cmFpbnRzKGUubmV3VmFsKX0sX2VuYWJsZUNvbnN0cmFpbnRzOmZ1bmN0aW9uKGUpe2U/KHRoaXMuY29uc3RyYWluKCksdGhpcy5fY3h5SGFuZGxlPXRoaXMuX2N4eUhhbmRsZXx8dGhpcy5vbihyLHRoaXMuX2NvbnN0cmFpbk9uWFlDaGFuZ2UpKTp0aGlzLl9jeHlIYW5kbGUmJih0aGlzLl9jeHlIYW5kbGUuZGV0YWNoKCksdGhpcy5fY3h5SGFuZGxlPW51bGwpfSxfY29uc3RyYWluT25YWUNoYW5nZTpmdW5jdGlvbihlKXtlLmNvbnN0cmFpbmVkfHwoZS5uZXdWYWw9dGhpcy5nZXRDb25zdHJhaW5lZFhZKGUubmV3VmFsKSl9LF9nZXRSZWdpb246ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGU/KGU9aC5vbmUoZSksZSYmKHQ9ZS5nZXQoZCkpKTp0PXRoaXMuX3Bvc05vZGUuZ2V0KHApLHR9fSxlLldpZGdldFBvc2l0aW9uQ29uc3RyYWluPW19LCIzLjE3LjIiLHtyZXF1aXJlczpbIndpZGdldC1wb3NpdGlvbiJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJvdmVybGF5IixmdW5jdGlvbihlLHQpe2UuT3ZlcmxheT1lLkJhc2UuY3JlYXRlKCJvdmVybGF5IixlLldpZGdldCxbZS5XaWRnZXRTdGRNb2QsZS5XaWRnZXRQb3NpdGlvbixlLldpZGdldFN0YWNrLGUuV2lkZ2V0UG9zaXRpb25BbGlnbixlLldpZGdldFBvc2l0aW9uQ29uc3RyYWluXSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbIndpZGdldCIsIndpZGdldC1zdGRtb2QiLCJ3aWRnZXQtcG9zaXRpb24iLCJ3aWRnZXQtcG9zaXRpb24tYWxpZ24iLCJ3aWRnZXQtc3RhY2siLCJ3aWRnZXQtcG9zaXRpb24tY29uc3RyYWluIl0sc2tpbm5hYmxlOiEwfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtYXV0b2hpZGUiLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbSh0KXtlLmFmdGVyKHRoaXMuX2JpbmRVSUF1dG9oaWRlLHRoaXMsZiksZS5hZnRlcih0aGlzLl9zeW5jVUlBdXRvaGlkZSx0aGlzLGwpLHRoaXMuZ2V0KGMpJiYodGhpcy5fYmluZFVJQXV0b2hpZGUoKSx0aGlzLl9zeW5jVUlBdXRvaGlkZSgpKX12YXIgbj0id2lkZ2V0QXV0b2hpZGUiLHI9ImF1dG9oaWRlIixpPSJjbGlja291dHNpZGUiLHM9ImZvY3Vzb3V0c2lkZSIsbz0iZG9jdW1lbnQiLHU9ImtleSIsYT0iZXNjIixmPSJiaW5kVUkiLGw9InN5bmNVSSIsYz0icmVuZGVyZWQiLGg9ImJvdW5kaW5nQm94IixwPSJ2aXNpYmxlIixkPSJDaGFuZ2UiLHY9ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZTttLkFUVFJTPXtoaWRlT246e3ZhbGlkYXRvcjplLkxhbmcuaXNBcnJheSx2YWx1ZUZuOmZ1bmN0aW9uKCl7cmV0dXJuW3tub2RlOmUub25lKG8pLGV2ZW50TmFtZTp1LGtleUNvZGU6YX1dfX19LG0ucHJvdG90eXBlPXtfdWlIYW5kbGVzQXV0b2hpZGU6bnVsbCxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fZGV0YWNoVUlIYW5kbGVzQXV0b2hpZGUoKX0sX2JpbmRVSUF1dG9oaWRlOmZ1bmN0aW9uKCl7dGhpcy5hZnRlcihwK2QsdGhpcy5fYWZ0ZXJIb3N0VmlzaWJsZUNoYW5nZUF1dG9oaWRlKSx0aGlzLmFmdGVyKCJoaWRlT25DaGFuZ2UiLHRoaXMuX2FmdGVySGlkZU9uQ2hhbmdlKX0sX3N5bmNVSUF1dG9oaWRlOmZ1bmN0aW9uKCl7dGhpcy5fdWlTZXRIb3N0VmlzaWJsZUF1dG9oaWRlKHRoaXMuZ2V0KHApKX0sX3VpU2V0SG9zdFZpc2libGVBdXRvaGlkZTpmdW5jdGlvbih0KXt0P2UubGF0ZXIoMSx0aGlzLCJfYXR0YWNoVUlIYW5kbGVzQXV0b2hpZGUiKTp0aGlzLl9kZXRhY2hVSUhhbmRsZXNBdXRvaGlkZSgpfSxfYXR0YWNoVUlIYW5kbGVzQXV0b2hpZGU6ZnVuY3Rpb24oKXtpZih0aGlzLl91aUhhbmRsZXNBdXRvaGlkZSlyZXR1cm47dmFyIHQ9dGhpcy5nZXQoaCksbj1lLmJpbmQodGhpcy5oaWRlLHRoaXMpLHI9W10saT10aGlzLHM9dGhpcy5nZXQoImhpZGVPbiIpLG89MCx1PXtub2RlOnVuZGVmaW5lZCxldjp1bmRlZmluZWQsa2V5Q29kZTp1bmRlZmluZWR9O2Zvcig7bzxzLmxlbmd0aDtvKyspdS5ub2RlPXNbb10ubm9kZSx1LmV2PXNbb10uZXZlbnROYW1lLHUua2V5Q29kZT1zW29dLmtleUNvZGUsIXUubm9kZSYmIXUua2V5Q29kZSYmdS5ldj9yLnB1c2godC5vbih1LmV2LG4pKTp1Lm5vZGUmJiF1LmtleUNvZGUmJnUuZXY/ci5wdXNoKHUubm9kZS5vbih1LmV2LG4pKTp1Lm5vZGUmJnUua2V5Q29kZSYmdS5ldiYmci5wdXNoKHUubm9kZS5vbih1LmV2LG4sdS5rZXlDb2RlKSk7dGhpcy5fdWlIYW5kbGVzQXV0b2hpZGU9cn0sX2RldGFjaFVJSGFuZGxlc0F1dG9oaWRlOmZ1bmN0aW9uKCl7ZS5lYWNoKHRoaXMuX3VpSGFuZGxlc0F1dG9oaWRlLGZ1bmN0aW9uKGUpe2UuZGV0YWNoKCl9KSx0aGlzLl91aUhhbmRsZXNBdXRvaGlkZT1udWxsfSxfYWZ0ZXJIb3N0VmlzaWJsZUNoYW5nZUF1dG9oaWRlOmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0SG9zdFZpc2libGVBdXRvaGlkZShlLm5ld1ZhbCl9LF9hZnRlckhpZGVPbkNoYW5nZTpmdW5jdGlvbihlKXt0aGlzLl9kZXRhY2hVSUhhbmRsZXNBdXRvaGlkZSgpLHRoaXMuZ2V0KHApJiZ0aGlzLl9hdHRhY2hVSUhhbmRsZXNBdXRvaGlkZSgpfX0sZS5XaWRnZXRBdXRvaGlkZT1tfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJiYXNlLWJ1aWxkIiwiZXZlbnQta2V5IiwiZXZlbnQtb3V0c2lkZSIsIndpZGdldCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJidXR0b24tY29yZSIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBpKGUpe3RoaXMuaW5pdGlhbGl6ZXIoZSl9dmFyIG49ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZSxyPWUuQXR0cmlidXRlQ29yZTtpLnByb3RvdHlwZT17VEVNUExBVEU6IjxidXR0b24vPiIsY29uc3RydWN0b3I6aSxpbml0aWFsaXplcjpmdW5jdGlvbihlKXt0aGlzLl9pbml0Tm9kZShlKSx0aGlzLl9pbml0QXR0cmlidXRlcyhlKSx0aGlzLl9yZW5kZXJVSShlKX0sX2luaXROb2RlOmZ1bmN0aW9uKHQpe3QuaG9zdD90aGlzLl9ob3N0PWUub25lKHQuaG9zdCk6dGhpcy5faG9zdD1lLk5vZGUuY3JlYXRlKHRoaXMuVEVNUExBVEUpfSxfaW5pdEF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSl7ci5jYWxsKHRoaXMsaS5BVFRSUyxlKX0sX3JlbmRlclVJOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXROb2RlKCksdD1lLmdldCgibm9kZU5hbWUiKS50b0xvd2VyQ2FzZSgpO2UuYWRkQ2xhc3MoaS5DTEFTU19OQU1FUy5CVVRUT04pLHQhPT0iYnV0dG9uIiYmdCE9PSJpbnB1dCImJmUuc2V0KCJyb2xlIiwiYnV0dG9uIil9LGVuYWJsZTpmdW5jdGlvbigpe3RoaXMuc2V0KCJkaXNhYmxlZCIsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5zZXQoImRpc2FibGVkIiwhMCl9LGdldE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faG9zdHx8KHRoaXMuX2hvc3Q9dGhpcy5nZXQoImJvdW5kaW5nQm94IikpLHRoaXMuX2hvc3R9LF9nZXRMYWJlbDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Tm9kZSgpLHQ9aS5fZ2V0VGV4dExhYmVsRnJvbU5vZGUoZSk7cmV0dXJuIHR9LF9nZXRMYWJlbEhUTUw6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE5vZGUoKSx0PWkuX2dldEhUTUxGcm9tTm9kZShlKTtyZXR1cm4gdH0sX3NldExhYmVsOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLkVzY2FwZS5odG1sKHQpO3JldHVybighcnx8ci5zcmMhPT0iaW50ZXJuYWwiKSYmdGhpcy5zZXQoImxhYmVsSFRNTCIsaSx7c3JjOiJpbnRlcm5hbCJ9KSxpfSxfc2V0TGFiZWxIVE1MOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmdldE5vZGUoKSxzPWkuX2dldExhYmVsTm9kZUZyb21QYXJlbnQociksbz1yLmdldCgibm9kZU5hbWUiKS50b0xvd2VyQ2FzZSgpO3JldHVybiBvPT09ImlucHV0Ij9zLnNldCgidmFsdWUiLGUpOnMuc2V0SFRNTChlKSwoIW58fG4uc3JjIT09ImludGVybmFsIikmJnRoaXMuc2V0KCJsYWJlbCIsZSx7c3JjOiJpbnRlcm5hbCJ9KSxlfSxfc2V0RGlzYWJsZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXROb2RlKCk7cmV0dXJuIHQuZ2V0RE9NTm9kZSgpLmRpc2FibGVkPWUsdC50b2dnbGVDbGFzcyhpLkNMQVNTX05BTUVTLkRJU0FCTEVELGUpLGV9fSxlLm1peChpLnByb3RvdHlwZSxyLnByb3RvdHlwZSksaS5BVFRSUz17bGFiZWw6e3NldHRlcjoiX3NldExhYmVsIixnZXR0ZXI6Il9nZXRMYWJlbCIsbGF6eUFkZDohMX0sbGFiZWxIVE1MOntzZXR0ZXI6Il9zZXRMYWJlbEhUTUwiLGdldHRlcjoiX2dldExhYmVsSFRNTCIsbGF6eUFkZDohMX0sZGlzYWJsZWQ6e3ZhbHVlOiExLHNldHRlcjoiX3NldERpc2FibGVkIixsYXp5QWRkOiExfX0saS5OQU1FPSJidXR0b24iLGkuQ0xBU1NfTkFNRVM9e0JVVFRPTjpuKCJidXR0b24iKSxESVNBQkxFRDpuKCJidXR0b24iLCJkaXNhYmxlZCIpLFNFTEVDVEVEOm4oImJ1dHRvbiIsInNlbGVjdGVkIiksTEFCRUw6bigiYnV0dG9uIiwibGFiZWwiKX0saS5BUklBX1NUQVRFUz17UFJFU1NFRDoiYXJpYS1wcmVzc2VkIixDSEVDS0VEOiJhcmlhLWNoZWNrZWQifSxpLkFSSUFfUk9MRVM9e0JVVFRPTjoiYnV0dG9uIixDSEVDS0JPWDoiY2hlY2tib3giLFRPR0dMRToidG9nZ2xlIn0saS5fZ2V0TGFiZWxOb2RlRnJvbVBhcmVudD1mdW5jdGlvbihlKXt2YXIgdD1lLm9uZSgiLiIraS5DTEFTU19OQU1FUy5MQUJFTCl8fGU7cmV0dXJuIHR9LGkuX2dldFRleHRMYWJlbEZyb21Ob2RlPWZ1bmN0aW9uKGUpe3ZhciB0PWkuX2dldExhYmVsTm9kZUZyb21QYXJlbnQoZSksbj10LmdldCgibm9kZU5hbWUiKS50b0xvd2VyQ2FzZSgpLHI9dC5nZXQobj09PSJpbnB1dCI/InZhbHVlIjoidGV4dCIpO3JldHVybiByfSxpLl9nZXRIVE1MRnJvbU5vZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5fZ2V0TGFiZWxOb2RlRnJvbVBhcmVudChlKSxuPXQuZ2V0SFRNTCgpO3JldHVybiBufSxpLl9nZXREaXNhYmxlZEZyb21Ob2RlPWZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgiZGlzYWJsZWQiKX0sZS5CdXR0b25Db3JlPWl9LCIzLjE3LjIiLHtyZXF1aXJlczpbImF0dHJpYnV0ZS1jb3JlIiwiY2xhc3NuYW1lbWFuYWdlciIsIm5vZGUtYmFzZSIsImVzY2FwZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJidXR0b24tcGx1Z2luIixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtuLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfWUuZXh0ZW5kKG4sZS5CdXR0b25Db3JlLHtfYWZ0ZXJOb2RlR2V0OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3IuQVRUUlMscj1uW3RdJiZuW3RdLmdldHRlciYmdGhpc1tuW3RdLmdldHRlcl07aWYocilyZXR1cm4gbmV3IGUuRG8uQWx0ZXJSZXR1cm4oImdldCAiK3Qsci5jYWxsKHRoaXMpKX0sX2FmdGVyTm9kZVNldDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3IuQVRUUlMscj1uW2VdJiZuW2VdLnNldHRlciYmdGhpc1tuW2VdLnNldHRlcl07ciYmci5jYWxsKHRoaXMsdCl9LF9pbml0Tm9kZTpmdW5jdGlvbih0KXt2YXIgbj10Lmhvc3Q7dGhpcy5faG9zdD1uLGUuRG8uYWZ0ZXIodGhpcy5fYWZ0ZXJOb2RlR2V0LG4sImdldCIsdGhpcyksZS5Eby5hZnRlcih0aGlzLl9hZnRlck5vZGVTZXQsbiwic2V0Iix0aGlzKX0sZGVzdHJveTpmdW5jdGlvbigpe319LHtBVFRSUzplLm1lcmdlKGUuQnV0dG9uQ29yZS5BVFRSUyksTkFNRToiYnV0dG9uUGx1Z2luIixOUzoiYnV0dG9uIn0pLG4uY3JlYXRlTm9kZT1mdW5jdGlvbih0LG4pe3ZhciByO3JldHVybiB0JiYhbiYmIXQubm9kZVR5cGUmJiF0LmdldERPTU5vZGUmJnR5cGVvZiB0IT0ic3RyaW5nIiYmKG49dCx0PW4uc3JjTm9kZSksbj1ufHx7fSxyPW4udGVtcGxhdGV8fGUuUGx1Z2luLkJ1dHRvbi5wcm90b3R5cGUuVEVNUExBVEUsdD10fHxuLnNyY05vZGV8fGUuRE9NLmNyZWF0ZShyKSxlLm9uZSh0KS5wbHVnKGUuUGx1Z2luLkJ1dHRvbixuKX0sZS5uYW1lc3BhY2UoIlBsdWdpbiIpLkJ1dHRvbj1ufSwiMy4xNy4yIix7cmVxdWlyZXM6WyJidXR0b24tY29yZSIsImNzc2J1dHRvbiIsIm5vZGUtcGx1Z2luaG9zdCJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJ3aWRnZXQtYnV0dG9ucyIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBwKGUpe3JldHVybiEhZS5nZXRET01Ob2RlfWZ1bmN0aW9uIGQoKXt0aGlzLl9idXR0b25zSGFuZGxlcz17fX12YXIgbj1lLkFycmF5LHI9ZS5MYW5nLGk9ZS5PYmplY3Qscz1lLlBsdWdpbi5CdXR0b24sbz1lLldpZGdldCx1PWUuV2lkZ2V0U3RkTW9kLGE9ZS5DbGFzc05hbWVNYW5hZ2VyLmdldENsYXNzTmFtZSxmPXIuaXNBcnJheSxsPXIuaXNOdW1iZXIsYz1yLmlzU3RyaW5nLGg9ci5pc1ZhbHVlO2QuQVRUUlM9e2J1dHRvbnM6e2dldHRlcjoiX2dldEJ1dHRvbnMiLHNldHRlcjoiX3NldEJ1dHRvbnMiLHZhbHVlOnt9fSxkZWZhdWx0QnV0dG9uOntyZWFkT25seTohMCx2YWx1ZTpudWxsfX0sZC5DTEFTU19OQU1FUz17YnV0dG9uOmEoImJ1dHRvbiIpLGJ1dHRvbnM6by5nZXRDbGFzc05hbWUoImJ1dHRvbnMiKSxwcmltYXJ5OmEoImJ1dHRvbiIsInByaW1hcnkiKX0sZC5IVE1MX1BBUlNFUj17YnV0dG9uczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcGFyc2VCdXR0b25zKGUpfX0sZC5OT05fQlVUVE9OX05PREVfQ0ZHPVsiYWN0aW9uIiwiY2xhc3NOYW1lcyIsImNvbnRleHQiLCJldmVudHMiLCJpc0RlZmF1bHQiLCJzZWN0aW9uIl0sZC5wcm90b3R5cGU9e0JVVFRPTlM6e30sQlVUVE9OU19URU1QTEFURToiPHNwYW4gLz4iLERFRkFVTFRfQlVUVE9OU19TRUNUSU9OOnUuRk9PVEVSLGluaXRpYWxpemVyOmZ1bmN0aW9uKCl7dGhpcy5fc3RkTW9kTm9kZXx8ZS5lcnJvcigiV2lkZ2V0U3RkTW9kIG11c3QgYmUgYWRkZWQgdG8gYSBXaWRnZXQgYmVmb3JlIFdpZGdldEJ1dHRvbnMuIiksdGhpcy5fbWFwQnV0dG9ucyh0aGlzLmdldCgiYnV0dG9ucyIpKSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5hZnRlcih7YnV0dG9uc0NoYW5nZTplLmJpbmQoIl9hZnRlckJ1dHRvbnNDaGFuZ2UiLHRoaXMpLGRlZmF1bHRCdXR0b25DaGFuZ2U6ZS5iaW5kKCJfYWZ0ZXJEZWZhdWx0QnV0dG9uQ2hhbmdlIix0aGlzKX0pLGUuYWZ0ZXIodGhpcy5fYmluZFVJQnV0dG9ucyx0aGlzLCJiaW5kVUkiKSxlLmFmdGVyKHRoaXMuX3N5bmNVSUJ1dHRvbnMsdGhpcywic3luY1VJIil9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXtpLmVhY2godGhpcy5fYnV0dG9uc0hhbmRsZXMsZnVuY3Rpb24oZSl7ZS5kZXRhY2goKX0pLGRlbGV0ZSB0aGlzLl9idXR0b25zSGFuZGxlcyxkZWxldGUgdGhpcy5fYnV0dG9uc01hcCxkZWxldGUgdGhpcy5fZGVmYXVsdEJ1dHRvbn0sYWRkQnV0dG9uOmZ1bmN0aW9uKGUsdCxyKXt2YXIgaT10aGlzLmdldCgiYnV0dG9ucyIpLHMsbztyZXR1cm4gcChlKXx8KGU9dGhpcy5fbWVyZ2VCdXR0b25Db25maWcoZSksdHx8KHQ9ZS5zZWN0aW9uKSksdHx8KHQ9dGhpcy5ERUZBVUxUX0JVVFRPTlNfU0VDVElPTikscz1pW3RdfHwoaVt0XT1bXSksbChyKXx8KHI9cy5sZW5ndGgpLHMuc3BsaWNlKHIsMCxlKSxvPW4uaW5kZXhPZihzLGUpLHRoaXMuc2V0KCJidXR0b25zIixpLHtidXR0b246ZSxzZWN0aW9uOnQsaW5kZXg6byxzcmM6ImFkZCJ9KSx0aGlzfSxnZXRCdXR0b246ZnVuY3Rpb24oZSx0KXtpZighaChlKSlyZXR1cm47dmFyIG49dGhpcy5fYnV0dG9uc01hcCxyO3JldHVybiB0fHwodD10aGlzLkRFRkFVTFRfQlVUVE9OU19TRUNUSU9OKSxsKGUpPyhyPXRoaXMuZ2V0KCJidXR0b25zIiksclt0XSYmclt0XVtlXSk6YXJndW1lbnRzLmxlbmd0aD4xP25bdCsiOiIrZV06bltlXX0scmVtb3ZlQnV0dG9uOmZ1bmN0aW9uKGUsdCl7aWYoIWgoZSkpcmV0dXJuIHRoaXM7dmFyIHI9dGhpcy5nZXQoImJ1dHRvbnMiKSxzO3JldHVybiBsKGUpPyh0fHwodD10aGlzLkRFRkFVTFRfQlVUVE9OU19TRUNUSU9OKSxzPWUsZT1yW3RdW3NdKTooYyhlKSYmKGU9dGhpcy5nZXRCdXR0b24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxpLnNvbWUocixmdW5jdGlvbihyLGkpe3M9bi5pbmRleE9mKHIsZSk7aWYocz4tMSlyZXR1cm4gdD1pLCEwfSkpLGUmJnM+LTEmJihyW3RdLnNwbGljZShzLDEpLHRoaXMuc2V0KCJidXR0b25zIixyLHtidXR0b246ZSxzZWN0aW9uOnQsaW5kZXg6cyxzcmM6InJlbW92ZSJ9KSksdGhpc30sX2JpbmRVSUJ1dHRvbnM6ZnVuY3Rpb24oKXt2YXIgdD1lLmJpbmQoIl9hZnRlckNvbnRlbnRDaGFuZ2VCdXR0b25zIix0aGlzKTt0aGlzLmFmdGVyKHt2aXNpYmxlQ2hhbmdlOmUuYmluZCgiX2FmdGVyVmlzaWJsZUNoYW5nZUJ1dHRvbnMiLHRoaXMpLGhlYWRlckNvbnRlbnRDaGFuZ2U6dCxib2R5Q29udGVudENoYW5nZTp0LGZvb3RlckNvbnRlbnRDaGFuZ2U6dH0pfSxfY3JlYXRlQnV0dG9uOmZ1bmN0aW9uKHQpe3ZhciByLGksbyx1LGEsZixsLGg7aWYocCh0KSlyZXR1cm4gZS5vbmUodC5nZXRET01Ob2RlKCkpLnBsdWcocyk7cj1lLm1lcmdlKHtjb250ZXh0OnRoaXMsZXZlbnRzOiJjbGljayIsbGFiZWw6dC52YWx1ZX0sdCksaT1lLm1lcmdlKHIpLG89ZC5OT05fQlVUVE9OX05PREVfQ0ZHO2Zvcih1PTAsYT1vLmxlbmd0aDt1PGE7dSs9MSlkZWxldGUgaVtvW3VdXTtyZXR1cm4gdD1zLmNyZWF0ZU5vZGUoaSksbD1yLmNvbnRleHQsZj1yLmFjdGlvbixjKGYpJiYoZj1lLmJpbmQoZixsKSksaD10Lm9uKHIuZXZlbnRzLGYsbCksdGhpcy5fYnV0dG9uc0hhbmRsZXNbZS5zdGFtcCh0LCEwKV09aCx0LnNldERhdGEoIm5hbWUiLHRoaXMuX2dldEJ1dHRvbk5hbWUocikpLHQuc2V0RGF0YSgiZGVmYXVsdCIsdGhpcy5fZ2V0QnV0dG9uRGVmYXVsdChyKSksbi5lYWNoKG4oci5jbGFzc05hbWVzKSx0LmFkZENsYXNzLHQpLHR9LF9nZXRCdXR0b25Db250YWluZXI6ZnVuY3Rpb24odCxuKXt2YXIgcj11LlNFQ1RJT05fQ0xBU1NfTkFNRVNbdF0saT1kLkNMQVNTX05BTUVTLmJ1dHRvbnMscz10aGlzLmdldCgiY29udGVudEJveCIpLG8sYTtyZXR1cm4gbz0iLiIrcisiIC4iK2ksYT1zLm9uZShvKSwhYSYmbiYmKGE9ZS5Ob2RlLmNyZWF0ZSh0aGlzLkJVVFRPTlNfVEVNUExBVEUpLGEuYWRkQ2xhc3MoaSkpLGF9LF9nZXRCdXR0b25EZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PXAoZSk/ZS5nZXREYXRhKCJkZWZhdWx0Iik6ZS5pc0RlZmF1bHQ7cmV0dXJuIGModCk/dC50b0xvd2VyQ2FzZSgpPT09InRydWUiOiEhdH0sX2dldEJ1dHRvbk5hbWU6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHAoZSk/dD1lLmdldERhdGEoIm5hbWUiKXx8ZS5nZXQoIm5hbWUiKTp0PWUmJihlLm5hbWV8fGUudHlwZSksdH0sX2dldEJ1dHRvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGkuZWFjaChlLGZ1bmN0aW9uKGUsbil7dFtuXT1lLmNvbmNhdCgpfSksdH0sX21hcEJ1dHRvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2J1dHRvbnNNYXAscj10aGlzLl9nZXRCdXR0b25OYW1lKGUpLGk9dGhpcy5fZ2V0QnV0dG9uRGVmYXVsdChlKTtyJiYobltyXT1lLG5bdCsiOiIrcl09ZSksaSYmKHRoaXMuX2RlZmF1bHRCdXR0b249ZSl9LF9tYXBCdXR0b25zOmZ1bmN0aW9uKGUpe3RoaXMuX2J1dHRvbnNNYXA9e30sdGhpcy5fZGVmYXVsdEJ1dHRvbj1udWxsLGkuZWFjaChlLGZ1bmN0aW9uKGUsdCl7dmFyIG4scjtmb3Iobj0wLHI9ZS5sZW5ndGg7bjxyO24rPTEpdGhpcy5fbWFwQnV0dG9uKGVbbl0sdCl9LHRoaXMpfSxfbWVyZ2VCdXR0b25Db25maWc6ZnVuY3Rpb24odCl7dmFyIG4scixpLHMsbyx1O3JldHVybiB0PWModCk/e25hbWU6dH06ZS5tZXJnZSh0KSx0LnNyY05vZGUmJihzPXQuc3JjTm9kZSxvPXMuZ2V0KCJ0YWdOYW1lIikudG9Mb3dlckNhc2UoKSx1PXMuZ2V0KG89PT0iaW5wdXQiPyJ2YWx1ZSI6InRleHQiKSxuPXtkaXNhYmxlZDohIXMuZ2V0KCJkaXNhYmxlZCIpLGlzRGVmYXVsdDp0aGlzLl9nZXRCdXR0b25EZWZhdWx0KHMpLG5hbWU6dGhpcy5fZ2V0QnV0dG9uTmFtZShzKX0sdSYmKG4ubGFiZWw9dSksZS5taXgodCxuLCExLG51bGwsMCwhMCkpLGk9dGhpcy5fZ2V0QnV0dG9uTmFtZSh0KSxyPXRoaXMuQlVUVE9OUyYmdGhpcy5CVVRUT05TW2ldLHImJmUubWl4KHQsciwhMSxudWxsLDAsITApLHR9LF9wYXJzZUJ1dHRvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9Ii4iK2QuQ0xBU1NfTkFNRVMuYnV0dG9uLHI9WyJoZWFkZXIiLCJib2R5IiwiZm9vdGVyIl0saT1udWxsO3JldHVybiBuLmVhY2gocixmdW5jdGlvbihlKXt2YXIgbj10aGlzLl9nZXRCdXR0b25Db250YWluZXIoZSkscj1uJiZuLmFsbCh0KSxzO2lmKCFyfHxyLmlzRW1wdHkoKSlyZXR1cm47cz1bXSxyLmVhY2goZnVuY3Rpb24oZSl7cy5wdXNoKHtzcmNOb2RlOmV9KX0pLGl8fChpPXt9KSxpW2VdPXN9LHRoaXMpLGl9LF9zZXRCdXR0b25zOmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoZSxyKXtpZighZihlKSlyZXR1cm47dmFyIGkscyxvLHU7Zm9yKGk9MCxzPWUubGVuZ3RoO2k8cztpKz0xKW89ZVtpXSx1PXIscChvKXx8KG89dGhpcy5fbWVyZ2VCdXR0b25Db25maWcobyksdXx8KHU9by5zZWN0aW9uKSksbz10aGlzLl9jcmVhdGVCdXR0b24obyksdXx8KHU9dCksKG5bdV18fChuW3VdPVtdKSkucHVzaChvKX12YXIgdD10aGlzLkRFRkFVTFRfQlVUVE9OU19TRUNUSU9OLG49e307cmV0dXJuIGYoZSk/ci5jYWxsKHRoaXMsZSk6aS5lYWNoKGUscix0aGlzKSxufSxfc3luY1VJQnV0dG9uczpmdW5jdGlvbigpe3RoaXMuX3VpU2V0QnV0dG9ucyh0aGlzLmdldCgiYnV0dG9ucyIpKSx0aGlzLl91aVNldERlZmF1bHRCdXR0b24odGhpcy5nZXQoImRlZmF1bHRCdXR0b24iKSksdGhpcy5fdWlTZXRWaXNpYmxlQnV0dG9ucyh0aGlzLmdldCgidmlzaWJsZSIpKX0sX3VpSW5zZXJ0QnV0dG9uOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1kLkNMQVNTX05BTUVTLmJ1dHRvbixpPXRoaXMuX2dldEJ1dHRvbkNvbnRhaW5lcih0LCEwKSxzPWkuYWxsKCIuIityKTtpLmluc2VydEJlZm9yZShlLHMuaXRlbShuKSksdGhpcy5zZXRTdGRNb2RDb250ZW50KHQsaSwiYWZ0ZXIiKX0sX3VpUmVtb3ZlQnV0dG9uOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLnN0YW1wKHQsdGhpcykscz10aGlzLl9idXR0b25zSGFuZGxlcyxvPXNbaV0sdSxhO28mJm8uZGV0YWNoKCksZGVsZXRlIHNbaV0sdC5yZW1vdmUoKSxyfHwocj17fSksci5wcmVzZXJ2ZUNvbnRlbnR8fCh1PXRoaXMuX2dldEJ1dHRvbkNvbnRhaW5lcihuKSxhPWQuQ0xBU1NfTkFNRVMuYnV0dG9uLHUmJnUuYWxsKCIuIithKS5pc0VtcHR5KCkmJih1LnJlbW92ZSgpLHRoaXMuX3VwZGF0ZUNvbnRlbnRCdXR0b25zKG4pKSl9LF91aVNldEJ1dHRvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZC5DTEFTU19OQU1FUy5idXR0b24scj1bImhlYWRlciIsImJvZHkiLCJmb290ZXIiXTtuLmVhY2gocixmdW5jdGlvbihuKXt2YXIgcj1lW25dfHxbXSxpPXIubGVuZ3RoLHM9dGhpcy5fZ2V0QnV0dG9uQ29udGFpbmVyKG4saSksbz0hMSx1LGEsZixsO2lmKCFzKXJldHVybjt1PXMuYWxsKCIuIit0KTtmb3IoYT0wO2E8aTthKz0xKWY9clthXSxsPXUuaW5kZXhPZihmKSxsPi0xPyh1LnNwbGljZShsLDEpLGwhPT1hJiYocy5pbnNlcnRCZWZvcmUoZixhKzEpLG89ITApKToocy5hcHBlbmRDaGlsZChmKSxvPSEwKTt1LmVhY2goZnVuY3Rpb24oZSl7dGhpcy5fdWlSZW1vdmVCdXR0b24oZSxuLHtwcmVzZXJ2ZUNvbnRlbnQ6ITB9KSxvPSEwfSx0aGlzKTtpZihpPT09MCl7cy5yZW1vdmUoKSx0aGlzLl91cGRhdGVDb250ZW50QnV0dG9ucyhuKTtyZXR1cm59byYmdGhpcy5zZXRTdGRNb2RDb250ZW50KG4scywiYWZ0ZXIiKX0sdGhpcyl9LF91aVNldERlZmF1bHRCdXR0b246ZnVuY3Rpb24oZSx0KXt2YXIgbj1kLkNMQVNTX05BTUVTLnByaW1hcnk7ZSYmZS5hZGRDbGFzcyhuKSx0JiZ0LnJlbW92ZUNsYXNzKG4pfSxfdWlTZXRWaXNpYmxlQnV0dG9uczpmdW5jdGlvbihlKXtpZighZSlyZXR1cm47dmFyIHQ9dGhpcy5nZXQoImRlZmF1bHRCdXR0b24iKTt0JiZ0LmZvY3VzKCl9LF91bk1hcEJ1dHRvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2J1dHRvbnNNYXAscj10aGlzLl9nZXRCdXR0b25OYW1lKGUpLGk7ciYmKG5bcl09PT1lJiZkZWxldGUgCm5bcl0saT10KyI6IityLG5baV09PT1lJiZkZWxldGUgbltpXSksdGhpcy5fZGVmYXVsdEJ1dHRvbj09PWUmJih0aGlzLl9kZWZhdWx0QnV0dG9uPW51bGwpfSxfdXBkYXRlRGVmYXVsdEJ1dHRvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2RlZmF1bHRCdXR0b247dGhpcy5nZXQoImRlZmF1bHRCdXR0b24iKSE9PWUmJnRoaXMuX3NldCgiZGVmYXVsdEJ1dHRvbiIsZSl9LF91cGRhdGVDb250ZW50QnV0dG9uczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFN0ZE1vZE5vZGUoZSkuZ2V0KCJjaGlsZE5vZGVzIik7dGhpcy5zZXQoZSsiQ29udGVudCIsdC5pc0VtcHR5KCk/bnVsbDp0LHtzcmM6ImJ1dHRvbnMifSl9LF9hZnRlckJ1dHRvbnNDaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5uZXdWYWwsbj1lLnNlY3Rpb24scj1lLmluZGV4LGk9ZS5zcmMscztpZihpPT09ImFkZCIpe3M9dFtuXVtyXSx0aGlzLl9tYXBCdXR0b24ocyxuKSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5fdWlJbnNlcnRCdXR0b24ocyxuLHIpO3JldHVybn1pZihpPT09InJlbW92ZSIpe3M9ZS5idXR0b24sdGhpcy5fdW5NYXBCdXR0b24ocyxuKSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5fdWlSZW1vdmVCdXR0b24ocyxuKTtyZXR1cm59dGhpcy5fbWFwQnV0dG9ucyh0KSx0aGlzLl91cGRhdGVEZWZhdWx0QnV0dG9uKCksdGhpcy5fdWlTZXRCdXR0b25zKHQpfSxfYWZ0ZXJDb250ZW50Q2hhbmdlQnV0dG9uczpmdW5jdGlvbihlKXt2YXIgdD1lLnNyYyxuPWUuc3RkTW9kUG9zaXRpb24scj0hbnx8bj09PXUuUkVQTEFDRTtyJiZ0IT09ImJ1dHRvbnMiJiZ0IT09by5VSV9TUkMmJnRoaXMuX3VpU2V0QnV0dG9ucyh0aGlzLmdldCgiYnV0dG9ucyIpKX0sX2FmdGVyRGVmYXVsdEJ1dHRvbkNoYW5nZTpmdW5jdGlvbihlKXt0aGlzLl91aVNldERlZmF1bHRCdXR0b24oZS5uZXdWYWwsZS5wcmV2VmFsKX0sX2FmdGVyVmlzaWJsZUNoYW5nZUJ1dHRvbnM6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRWaXNpYmxlQnV0dG9ucyhlLm5ld1ZhbCl9fSxlLldpZGdldEJ1dHRvbnM9ZH0sIjMuMTcuMiIse3JlcXVpcmVzOlsiYnV0dG9uLXBsdWdpbiIsImNzc2J1dHRvbiIsIndpZGdldC1zdGRtb2QiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgid2lkZ2V0LW1vZGFsaXR5IixmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGcoZSl7fXZhciBuPSJ3aWRnZXQiLHI9InJlbmRlclVJIixpPSJiaW5kVUkiLHM9InN5bmNVSSIsbz0iYm91bmRpbmdCb3giLHU9InZpc2libGUiLGE9InpJbmRleCIsZj0iQ2hhbmdlIixsPWUuTGFuZy5pc0Jvb2xlYW4sYz1lLkNsYXNzTmFtZU1hbmFnZXIuZ2V0Q2xhc3NOYW1lLGg9Im1hc2tTaG93IixwPSJtYXNrSGlkZSIsZD0iY2xpY2tvdXRzaWRlIix2PSJmb2N1c291dHNpZGUiLG09ZnVuY3Rpb24oKXsKLyohIElTX1BPU0lUSU9OX0ZJWEVEX1NVUFBPUlRFRCAtIEp1cml5IFpheXRzZXYgKGthbmdheCkgLSBodHRwOi8veXVyYS50aGlua3dlYjIuY29tL2NmdC8gKi8KO3ZhciB0PWUuY29uZmlnLmRvYyxuPW51bGwscixpO3JldHVybiB0LmNyZWF0ZUVsZW1lbnQmJihyPXQuY3JlYXRlRWxlbWVudCgiZGl2IiksciYmci5zdHlsZSYmKHIuc3R5bGUucG9zaXRpb249ImZpeGVkIixyLnN0eWxlLnRvcD0iMTBweCIsaT10LmJvZHksaSYmaS5hcHBlbmRDaGlsZCYmaS5yZW1vdmVDaGlsZCYmKGkuYXBwZW5kQ2hpbGQociksbj1yLm9mZnNldFRvcD09PTEwLGkucmVtb3ZlQ2hpbGQocikpKSksbn0oKSx5PSJtb2RhbCIsYj0ibWFzayIsdz17bW9kYWw6YyhuLHkpLG1hc2s6YyhuLGIpfTtnLkFUVFJTPXttYXNrTm9kZTp7Z2V0dGVyOiJfZ2V0TWFza05vZGUiLHJlYWRPbmx5OiEwfSxtb2RhbDp7dmFsdWU6ITEsdmFsaWRhdG9yOmx9LGZvY3VzT246e3ZhbHVlRm46ZnVuY3Rpb24oKXtyZXR1cm5be2V2ZW50TmFtZTpkfSx7ZXZlbnROYW1lOnZ9XX0sdmFsaWRhdG9yOmUuTGFuZy5pc0FycmF5fX0sZy5DTEFTU0VTPXcsZy5fTUFTSz1udWxsLGcuX0dFVF9NQVNLPWZ1bmN0aW9uKCl7dmFyIHQ9Zy5fTUFTSyxuPWUub25lKCJ3aW4iKTtyZXR1cm4gdCYmdC5nZXRET01Ob2RlKCkhPT1udWxsJiZ0LmluRG9jKCk/dDoodD1lLk5vZGUuY3JlYXRlKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKHcubWFzayksZy5fTUFTSz10LG0/dC5zZXRTdHlsZXMoe3Bvc2l0aW9uOiJmaXhlZCIsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsdG9wOiIwIixsZWZ0OiIwIixkaXNwbGF5OiJibG9jayJ9KTp0LnNldFN0eWxlcyh7cG9zaXRpb246ImFic29sdXRlIix3aWR0aDpuLmdldCgid2luV2lkdGgiKSsicHgiLGhlaWdodDpuLmdldCgid2luSGVpZ2h0IikrInB4Iix0b3A6IjAiLGxlZnQ6IjAiLGRpc3BsYXk6ImJsb2NrIn0pLHQpfSxnLlNUQUNLPVtdLGcucHJvdG90eXBlPXtpbml0aWFsaXplcjpmdW5jdGlvbigpe2UuYWZ0ZXIodGhpcy5fcmVuZGVyVUlNb2RhbCx0aGlzLHIpLGUuYWZ0ZXIodGhpcy5fc3luY1VJTW9kYWwsdGhpcyxzKSxlLmFmdGVyKHRoaXMuX2JpbmRVSU1vZGFsLHRoaXMsaSl9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl91aVNldEhvc3RWaXNpYmxlTW9kYWwoITEpfSxfdWlIYW5kbGVzTW9kYWw6bnVsbCxfcmVuZGVyVUlNb2RhbDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KG8pO3RoaXMuX3JlcG9zaXRpb25NYXNrKHRoaXMpLGUuYWRkQ2xhc3Mody5tb2RhbCl9LF9iaW5kVUlNb2RhbDpmdW5jdGlvbigpe3RoaXMuYWZ0ZXIodStmLHRoaXMuX2FmdGVySG9zdFZpc2libGVDaGFuZ2VNb2RhbCksdGhpcy5hZnRlcihhK2YsdGhpcy5fYWZ0ZXJIb3N0WkluZGV4Q2hhbmdlTW9kYWwpLHRoaXMuYWZ0ZXIoImZvY3VzT25DaGFuZ2UiLHRoaXMuX2FmdGVyRm9jdXNPbkNoYW5nZSksKCFtfHxlLlVBLmlvcyYmZS5VQS5pb3M8NXx8ZS5VQS5hbmRyb2lkJiZlLlVBLmFuZHJvaWQ8MykmJmUub25lKCJ3aW4iKS5vbigic2Nyb2xsIix0aGlzLl9yZXN5bmNNYXNrLHRoaXMpfSxfc3luY1VJTW9kYWw6ZnVuY3Rpb24oKXt0aGlzLl91aVNldEhvc3RWaXNpYmxlTW9kYWwodGhpcy5nZXQodSkpfSxfZm9jdXM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldChvKSx0PWUuZ2V0KCJ0YWJJbmRleCIpO2Uuc2V0KCJ0YWJJbmRleCIsdD49MD90OjApLHRoaXMuZm9jdXMoKX0sX2JsdXI6ZnVuY3Rpb24oKXt0aGlzLmJsdXIoKX0sX2dldE1hc2tOb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIGcuX0dFVF9NQVNLKCl9LF91aVNldEhvc3RWaXNpYmxlTW9kYWw6ZnVuY3Rpb24odCl7dmFyIG49Zy5TVEFDSyxyPXRoaXMuZ2V0KCJtYXNrTm9kZSIpLGk9dGhpcy5nZXQoIm1vZGFsIikscyxvO3Q/KGUuQXJyYXkuZWFjaChuLGZ1bmN0aW9uKGUpe2UuX2RldGFjaFVJSGFuZGxlc01vZGFsKCksZS5fYmx1cigpfSksbi51bnNoaWZ0KHRoaXMpLHRoaXMuX3JlcG9zaXRpb25NYXNrKHRoaXMpLHRoaXMuX3VpU2V0SG9zdFpJbmRleE1vZGFsKHRoaXMuZ2V0KGEpKSxpJiYoci5zaG93KCksZS5sYXRlcigxLHRoaXMsIl9hdHRhY2hVSUhhbmRsZXNNb2RhbCIpLHRoaXMuX2ZvY3VzKCkpKToobz1lLkFycmF5LmluZGV4T2Yobix0aGlzKSxvPj0wJiZuLnNwbGljZShvLDEpLHRoaXMuX2RldGFjaFVJSGFuZGxlc01vZGFsKCksdGhpcy5fYmx1cigpLG4ubGVuZ3RoPyhzPW5bMF0sdGhpcy5fcmVwb3NpdGlvbk1hc2socykscy5fdWlTZXRIb3N0WkluZGV4TW9kYWwocy5nZXQoYSkpLHMuZ2V0KCJtb2RhbCIpJiYoZS5sYXRlcigxLHMsIl9hdHRhY2hVSUhhbmRsZXNNb2RhbCIpLHMuX2ZvY3VzKCkpKTpyLmdldFN0eWxlKCJkaXNwbGF5Iik9PT0iYmxvY2siJiZyLmhpZGUoKSl9LF91aVNldEhvc3RaSW5kZXhNb2RhbDpmdW5jdGlvbihlKXt0aGlzLmdldCgibW9kYWwiKSYmdGhpcy5nZXQoIm1hc2tOb2RlIikuc2V0U3R5bGUoYSxlfHwwKX0sX2F0dGFjaFVJSGFuZGxlc01vZGFsOmZ1bmN0aW9uKCl7aWYodGhpcy5fdWlIYW5kbGVzTW9kYWx8fGcuU1RBQ0tbMF0hPT10aGlzKXJldHVybjt2YXIgdD10aGlzLmdldChvKSxuPXRoaXMuZ2V0KCJtYXNrTm9kZSIpLHI9dGhpcy5nZXQoImZvY3VzT24iKSxpPWUuYmluZCh0aGlzLl9mb2N1cyx0aGlzKSxzPVtdLHUsYSxmO2Zvcih1PTAsYT1yLmxlbmd0aDt1PGE7dSsrKWY9e30sZi5ub2RlPXJbdV0ubm9kZSxmLmV2PXJbdV0uZXZlbnROYW1lLGYua2V5Q29kZT1yW3VdLmtleUNvZGUsIWYubm9kZSYmIWYua2V5Q29kZSYmZi5ldj9zLnB1c2godC5vbihmLmV2LGkpKTpmLm5vZGUmJiFmLmtleUNvZGUmJmYuZXY/cy5wdXNoKGYubm9kZS5vbihmLmV2LGkpKTpmLm5vZGUmJmYua2V5Q29kZSYmZi5ldj9zLnB1c2goZi5ub2RlLm9uKGYuZXYsaSxmLmtleUNvZGUpKTplLkxvZygnZm9jdXNPbiBBVFRSIEVycm9yOiBUaGUgZXZlbnQgd2l0aCBuYW1lICInK2YuZXYrJyIgY291bGQgbm90IGJlIGF0dGFjaGVkLicpO218fHMucHVzaChlLm9uZSgid2luIikub24oInNjcm9sbCIsZS5iaW5kKGZ1bmN0aW9uKCl7bi5zZXRTdHlsZSgidG9wIixuLmdldCgiZG9jU2Nyb2xsWSIpKX0sdGhpcykpKSx0aGlzLl91aUhhbmRsZXNNb2RhbD1zfSxfZGV0YWNoVUlIYW5kbGVzTW9kYWw6ZnVuY3Rpb24oKXtlLmVhY2godGhpcy5fdWlIYW5kbGVzTW9kYWwsZnVuY3Rpb24oZSl7ZS5kZXRhY2goKX0pLHRoaXMuX3VpSGFuZGxlc01vZGFsPW51bGx9LF9hZnRlckhvc3RWaXNpYmxlQ2hhbmdlTW9kYWw6ZnVuY3Rpb24oZSl7dGhpcy5fdWlTZXRIb3N0VmlzaWJsZU1vZGFsKGUubmV3VmFsKX0sX2FmdGVySG9zdFpJbmRleENoYW5nZU1vZGFsOmZ1bmN0aW9uKGUpe3RoaXMuX3VpU2V0SG9zdFpJbmRleE1vZGFsKGUubmV3VmFsKX0saXNOZXN0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT1nLlNUQUNLLmxlbmd0aCx0PWU+MT8hMDohMTtyZXR1cm4gdH0sX3JlcG9zaXRpb25NYXNrOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuZ2V0KCJtb2RhbCIpLHI9dC5nZXQoIm1vZGFsIiksaT10aGlzLmdldCgibWFza05vZGUiKSxzLHU7aWYobiYmIXIpaS5yZW1vdmUoKSx0aGlzLmZpcmUocCk7ZWxzZSBpZighbiYmcnx8biYmcilpLnJlbW92ZSgpLHRoaXMuZmlyZShwKSxzPXQuZ2V0KG8pLHU9cy5nZXQoInBhcmVudE5vZGUiKXx8ZS5vbmUoImJvZHkiKSx1Lmluc2VydChpLHUuZ2V0KCJmaXJzdENoaWxkIikpLHRoaXMuZmlyZShoKX0sX3Jlc3luY01hc2s6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jdXJyZW50VGFyZ2V0LG49dC5nZXQoImRvY1Njcm9sbFgiKSxyPXQuZ2V0KCJkb2NTY3JvbGxZIiksaT10LmdldCgiaW5uZXJXaWR0aCIpfHx0LmdldCgid2luV2lkdGgiKSxzPXQuZ2V0KCJpbm5lckhlaWdodCIpfHx0LmdldCgid2luSGVpZ2h0Iiksbz10aGlzLmdldCgibWFza05vZGUiKTtvLnNldFN0eWxlcyh7dG9wOnIrInB4IixsZWZ0Om4rInB4Iix3aWR0aDppKyJweCIsaGVpZ2h0OnMrInB4In0pfSxfYWZ0ZXJGb2N1c09uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fZGV0YWNoVUlIYW5kbGVzTW9kYWwoKSx0aGlzLmdldCh1KSYmdGhpcy5fYXR0YWNoVUlIYW5kbGVzTW9kYWwoKX19LGUuV2lkZ2V0TW9kYWxpdHk9Z30sIjMuMTcuMiIse3JlcXVpcmVzOlsiYmFzZS1idWlsZCIsImV2ZW50LW91dHNpZGUiLCJ3aWRnZXQiXSxza2lubmFibGU6ITB9KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInBhbmVsIixmdW5jdGlvbihlLHQpe3ZhciBuPWUuQ2xhc3NOYW1lTWFuYWdlci5nZXRDbGFzc05hbWU7ZS5QYW5lbD1lLkJhc2UuY3JlYXRlKCJwYW5lbCIsZS5XaWRnZXQsW2UuV2lkZ2V0UG9zaXRpb24sZS5XaWRnZXRTdGRNb2QsZS5XaWRnZXRBdXRvaGlkZSxlLldpZGdldEJ1dHRvbnMsZS5XaWRnZXRNb2RhbGl0eSxlLldpZGdldFBvc2l0aW9uQWxpZ24sZS5XaWRnZXRQb3NpdGlvbkNvbnN0cmFpbixlLldpZGdldFN0YWNrXSx7QlVUVE9OUzp7Y2xvc2U6e2xhYmVsOiJDbG9zZSIsYWN0aW9uOiJoaWRlIixzZWN0aW9uOiJoZWFkZXIiLHRlbXBsYXRlOic8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgLz4nLGNsYXNzTmFtZXM6bigiYnV0dG9uIiwiY2xvc2UiKX19fSx7QVRUUlM6e2J1dHRvbnM6e3ZhbHVlOlsiY2xvc2UiXX19fSl9LCIzLjE3LjIiLHtyZXF1aXJlczpbIndpZGdldCIsIndpZGdldC1hdXRvaGlkZSIsIndpZGdldC1idXR0b25zIiwid2lkZ2V0LW1vZGFsaXR5Iiwid2lkZ2V0LXBvc2l0aW9uIiwid2lkZ2V0LXBvc2l0aW9uLWFsaWduIiwid2lkZ2V0LXBvc2l0aW9uLWNvbnN0cmFpbiIsIndpZGdldC1zdGFjayIsIndpZGdldC1zdGRtb2QiXSxza2lubmFibGU6ITB9KTsKLyoKWVVJIDMuMTcuMiAoYnVpbGQgOWMzYzc4ZSkKQ29weXJpZ2h0IDIwMTQgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KTGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgpodHRwOi8veXVpbGlicmFyeS5jb20vbGljZW5zZS8KKi8KCllVSS5hZGQoInl1aS10aHJvdHRsZSIsZnVuY3Rpb24oZSx0KXsKLyohIEJhc2VkIG9uIHdvcmsgYnkgU2ltb24gV2lsbGlzb246IGh0dHA6Ly9naXN0LmdpdGh1Yi5jb20vMjkyNTYyICovCjtlLnRocm90dGxlPWZ1bmN0aW9uKHQsbil7bj1uP246ZS5jb25maWcudGhyb3R0bGVUaW1lfHwxNTA7aWYobj09PS0xKXJldHVybiBmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt2YXIgcj1lLkxhbmcubm93KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9ZS5MYW5nLm5vdygpO2ktcj5uJiYocj1pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19fSwiMy4xNy4yIix7cmVxdWlyZXM6WyJ5dWktYmFzZSJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkZC1kZG0tYmFzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbigpe24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O24uTkFNRT0iZGRtIixuLkFUVFJTPXtkcmFnQ3Vyc29yOnt2YWx1ZToibW92ZSJ9LGNsaWNrUGl4ZWxUaHJlc2g6e3ZhbHVlOjN9LGNsaWNrVGltZVRocmVzaDp7dmFsdWU6MWUzfSx0aHJvdHRsZVRpbWU6e3ZhbHVlOi0xfSxkcmFnTW9kZTp7dmFsdWU6InBvaW50IixzZXR0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NldERyYWdNb2RlKGUpLGV9fX0sZS5leHRlbmQobixlLkJhc2Use19jcmVhdGVQRzpmdW5jdGlvbigpe30sX2FjdGl2ZTpudWxsLF9zZXREcmFnTW9kZTpmdW5jdGlvbih0KXt0PT09bnVsbCYmKHQ9ZS5ERC5ERE0uZ2V0KCJkcmFnTW9kZSIpKTtzd2l0Y2godCl7Y2FzZSAxOmNhc2UiaW50ZXJzZWN0IjpyZXR1cm4gMTtjYXNlIDI6Y2FzZSJzdHJpY3QiOnJldHVybiAyO2Nhc2UgMDpjYXNlInBvaW50IjpyZXR1cm4gMH1yZXR1cm4gMH0sQ1NTX1BSRUZJWDplLkNsYXNzTmFtZU1hbmFnZXIuZ2V0Q2xhc3NOYW1lKCJkZCIpLF9hY3RpdmF0ZVRhcmdldHM6ZnVuY3Rpb24oKXt9LF9kcmFnczpbXSxhY3RpdmVEcmFnOiExLF9yZWdEcmFnOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldERyYWcoZS5nZXQoIm5vZGUiKSk/ITE6KHRoaXMuX2FjdGl2ZXx8dGhpcy5fc2V0dXBMaXN0ZW5lcnMoKSx0aGlzLl9kcmFncy5wdXNoKGUpLCEwKX0sX3VucmVnRHJhZzpmdW5jdGlvbih0KXt2YXIgbj1bXTtlLkFycmF5LmVhY2godGhpcy5fZHJhZ3MsZnVuY3Rpb24oZSl7ZSE9PXQmJihuW24ubGVuZ3RoXT1lKX0pLHRoaXMuX2RyYWdzPW59LF9zZXR1cExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX2NyZWF0ZVBHKCksdGhpcy5fYWN0aXZlPSEwO3ZhciB0PWUub25lKGUuY29uZmlnLmRvYyk7dC5vbigibW91c2Vtb3ZlIixlLnRocm90dGxlKGUuYmluZCh0aGlzLl9kb2NNb3ZlLHRoaXMpLHRoaXMuZ2V0KCJ0aHJvdHRsZVRpbWUiKSkpLHQub24oIm1vdXNldXAiLGUuYmluZCh0aGlzLl9lbmQsdGhpcykpfSxfc3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImRkbTpzdGFydCIpLHRoaXMuX3N0YXJ0RHJhZygpfSxfc3RhcnREcmFnOmZ1bmN0aW9uKCl7fSxfZW5kRHJhZzpmdW5jdGlvbigpe30sX2Ryb3BNb3ZlOmZ1bmN0aW9uKCl7fSxfZW5kOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmVEcmFnJiYodGhpcy5fc2hpbW1pbmc9ITEsdGhpcy5fZW5kRHJhZygpLHRoaXMuZmlyZSgiZGRtOmVuZCIpLHRoaXMuYWN0aXZlRHJhZy5lbmQuY2FsbCh0aGlzLmFjdGl2ZURyYWcpLHRoaXMuYWN0aXZlRHJhZz1udWxsKX0sc3RvcERyYWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmVEcmFnJiZ0aGlzLl9lbmQoKSx0aGlzfSxfc2hpbW1pbmc6ITEsX2RvY01vdmU6ZnVuY3Rpb24oZSl7dGhpcy5fc2hpbW1pbmd8fHRoaXMuX21vdmUoZSl9LF9tb3ZlOmZ1bmN0aW9uKGUpe3RoaXMuYWN0aXZlRHJhZyYmKHRoaXMuYWN0aXZlRHJhZy5fbW92ZS5jYWxsKHRoaXMuYWN0aXZlRHJhZyxlKSx0aGlzLl9kcm9wTW92ZSgpKX0sY3NzU2l6ZXN0b09iamVjdDpmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KCIgIik7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6dFsxXT10WzJdPXRbM109dFswXTticmVhaztjYXNlIDI6dFsyXT10WzBdLHRbM109dFsxXTticmVhaztjYXNlIDM6dFszXT10WzFdfXJldHVybnt0b3A6cGFyc2VJbnQodFswXSwxMCkscmlnaHQ6cGFyc2VJbnQodFsxXSwxMCksYm90dG9tOnBhcnNlSW50KHRbMl0sMTApLGxlZnQ6cGFyc2VJbnQodFszXSwxMCl9fSxnZXREcmFnOmZ1bmN0aW9uKHQpe3ZhciBuPSExLHI9ZS5vbmUodCk7cmV0dXJuIHIgaW5zdGFuY2VvZiBlLk5vZGUmJmUuQXJyYXkuZWFjaCh0aGlzLl9kcmFncyxmdW5jdGlvbihlKXtyLmNvbXBhcmVUbyhlLmdldCgibm9kZSIpKSYmKG49ZSl9KSxufSxzd2FwUG9zaXRpb246ZnVuY3Rpb24odCxuKXt0PWUuREQuRERNLmdldE5vZGUodCksbj1lLkRELkRETS5nZXROb2RlKG4pO3ZhciByPXQuZ2V0WFkoKSxpPW4uZ2V0WFkoKTtyZXR1cm4gdC5zZXRYWShpKSxuLnNldFhZKHIpLHR9LGdldE5vZGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBlLk5vZGU/dDoodCYmdC5nZXQ/ZS5XaWRnZXQmJnQgaW5zdGFuY2VvZiBlLldpZGdldD90PXQuZ2V0KCJib3VuZGluZ0JveCIpOnQ9dC5nZXQoIm5vZGUiKTp0PWUub25lKHQpLHQpfSxzd2FwTm9kZTpmdW5jdGlvbih0LG4pe3Q9ZS5ERC5ERE0uZ2V0Tm9kZSh0KSxuPWUuREQuRERNLmdldE5vZGUobik7dmFyIHI9bi5nZXQoInBhcmVudE5vZGUiKSxpPW4uZ2V0KCJuZXh0U2libGluZyIpO3JldHVybiBpPT09dD9yLmluc2VydEJlZm9yZSh0LG4pOm49PT10LmdldCgibmV4dFNpYmxpbmciKT9yLmluc2VydEJlZm9yZShuLHQpOih0LmdldCgicGFyZW50Tm9kZSIpLnJlcGxhY2VDaGlsZChuLHQpLHIuaW5zZXJ0QmVmb3JlKHQsaSkpLHR9fSksZS5uYW1lc3BhY2UoIkREIiksZS5ERC5ERE09bmV3IG59LCIzLjE3LjIiLHtyZXF1aXJlczpbIm5vZGUiLCJiYXNlIiwieXVpLXRocm90dGxlIiwiY2xhc3NuYW1lbWFuYWdlciJdfSk7Ci8qCllVSSAzLjE3LjIgKGJ1aWxkIDljM2M3OGUpCkNvcHlyaWdodCAyMDE0IFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KaHR0cDovL3l1aWxpYnJhcnkuY29tL2xpY2Vuc2UvCiovCgpZVUkuYWRkKCJkZC1kcmFnIixmdW5jdGlvbihlLHQpe3ZhciBuPWUuREQuRERNLHI9Im5vZGUiLGk9ImRyYWdnaW5nIixzPSJkcmFnTm9kZSIsbz0ib2Zmc2V0SGVpZ2h0Iix1PSJvZmZzZXRXaWR0aCIsYT0iZHJhZzptb3VzZURvd24iLGY9ImRyYWc6YWZ0ZXJNb3VzZURvd24iLGw9ImRyYWc6cmVtb3ZlSGFuZGxlIixjPSJkcmFnOmFkZEhhbmRsZSIsaD0iZHJhZzpyZW1vdmVJbnZhbGlkIixwPSJkcmFnOmFkZEludmFsaWQiLGQ9ImRyYWc6c3RhcnQiLHY9ImRyYWc6ZW5kIixtPSJkcmFnOmRyYWciLGc9ImRyYWc6YWxpZ24iLHk9ZnVuY3Rpb24odCl7dGhpcy5fbGF6eUFkZEF0dHJzPSExLHkuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHI9bi5fcmVnRHJhZyh0aGlzKTtyfHxlLmVycm9yKCJGYWlsZWQgdG8gcmVnaXN0ZXIgbm9kZSwgYWxyZWFkeSBpbiB1c2U6ICIrdC5ub2RlKX07eS5OQU1FPSJkcmFnIix5LlNUQVJUX0VWRU5UPSJtb3VzZWRvd24iLHkuQVRUUlM9e25vZGU6e3NldHRlcjpmdW5jdGlvbih0KXtpZih0aGlzLl9jYW5EcmFnKHQpKXJldHVybiB0O3ZhciBuPWUub25lKHQpO3JldHVybiBufHxlLmVycm9yKCJERC5EcmFnOiBJbnZhbGlkIE5vZGUgR2l2ZW46ICIrdCksbn19LGRyYWdOb2RlOntzZXR0ZXI6ZnVuY3Rpb24odCl7aWYodGhpcy5fY2FuRHJhZyh0KSlyZXR1cm4gdDt2YXIgbj1lLm9uZSh0KTtyZXR1cm4gbnx8ZS5lcnJvcigiREQuRHJhZzogSW52YWxpZCBkcmFnTm9kZSBHaXZlbjogIit0KSxufX0sb2Zmc2V0Tm9kZTp7dmFsdWU6ITB9LHN0YXJ0Q2VudGVyZWQ6e3ZhbHVlOiExfSxjbGlja1BpeGVsVGhyZXNoOnt2YWx1ZTpuLmdldCgiY2xpY2tQaXhlbFRocmVzaCIpfSxjbGlja1RpbWVUaHJlc2g6e3ZhbHVlOm4uZ2V0KCJjbGlja1RpbWVUaHJlc2giKX0sbG9jazp7dmFsdWU6ITEsc2V0dGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlP3RoaXMuZ2V0KHIpLmFkZENsYXNzKG4uQ1NTX1BSRUZJWCsiLWxvY2tlZCIpOnRoaXMuZ2V0KHIpLnJlbW92ZUNsYXNzKG4uQ1NTX1BSRUZJWCsiLWxvY2tlZCIpLGV9fSxkYXRhOnt2YWx1ZTohMX0sbW92ZTp7dmFsdWU6ITB9LHVzZVNoaW06e3ZhbHVlOiEwfSxhY3RpdmVIYW5kbGU6e3ZhbHVlOiExfSxwcmltYXJ5QnV0dG9uT25seTp7dmFsdWU6ITB9LGRyYWdnaW5nOnt2YWx1ZTohMX0scGFyZW50Ont2YWx1ZTohMX0sdGFyZ2V0Ont2YWx1ZTohMSxzZXR0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2hhbmRsZVRhcmdldChlKSxlfX0sZHJhZ01vZGU6e3ZhbHVlOm51bGwsc2V0dGVyOmZ1bmN0aW9uKGUpe3JldHVybiBuLl9zZXREcmFnTW9kZShlKX19LGdyb3Vwczp7dmFsdWU6WyJkZWZhdWx0Il0sZ2V0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dyb3Vwcz9lLk9iamVjdC5rZXlzKHRoaXMuX2dyb3Vwcyk6KHRoaXMuX2dyb3Vwcz17fSxbXSl9LHNldHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZ3JvdXBzPWUuQXJyYXkuaGFzaCh0KSx0fX0saGFuZGxlczp7dmFsdWU6bnVsbCxzZXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/KHRoaXMuX2hhbmRsZXM9e30sZS5BcnJheS5lYWNoKHQsZnVuY3Rpb24odCl7dmFyIG49dDtpZih0IGluc3RhbmNlb2YgZS5Ob2RlfHx0IGluc3RhbmNlb2YgZS5Ob2RlTGlzdCluPXQuX3l1aWQ7dGhpcy5faGFuZGxlc1tuXT10fSx0aGlzKSk6dGhpcy5faGFuZGxlcz1udWxsLHR9fSxidWJibGVzOntzZXR0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkVGFyZ2V0KGUpLGV9fSxoYWx0RG93bjp7dmFsdWU6ITB9fSxlLmV4dGVuZCh5LGUuQmFzZSx7X2NhbkRyYWc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuc2V0WFkmJmUuZ2V0WFkmJmUudGVzdCYmZS5jb250YWlucz8hMDohMX0sX2J1YmJsZVRhcmdldHM6ZS5ERC5ERE0sYWRkVG9Hcm91cDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZ3JvdXBzW2VdPSEwLG4uX2FjdGl2YXRlVGFyZ2V0cygpLHRoaXN9LHJlbW92ZUZyb21Hcm91cDpmdW5jdGlvbihlKXtyZXR1cm4gZGVsZXRlIHRoaXMuX2dyb3Vwc1tlXSxuLl9hY3RpdmF0ZVRhcmdldHMoKSx0aGlzfSx0YXJnZXQ6bnVsbCxfaGFuZGxlVGFyZ2V0OmZ1bmN0aW9uKHQpe2UuREQuRHJvcCYmKHQ9PT0hMT90aGlzLnRhcmdldCYmKG4uX3VucmVnVGFyZ2V0KHRoaXMudGFyZ2V0KSx0aGlzLnRhcmdldD1udWxsKTooZS5MYW5nLmlzT2JqZWN0KHQpfHwodD17fSksdC5idWJibGVUYXJnZXRzPXQuYnViYmxlVGFyZ2V0c3x8dGhpcy5nZXRUYXJnZXRzKCksdC5ub2RlPXRoaXMuZ2V0KHIpLHQuZ3JvdXBzPXQuZ3JvdXBzfHx0aGlzLmdldCgiZ3JvdXBzIiksdGhpcy50YXJnZXQ9bmV3IGUuREQuRHJvcCh0KSkpfSxfZ3JvdXBzOm51bGwsX2NyZWF0ZUV2ZW50czpmdW5jdGlvbigpe3RoaXMucHVibGlzaChhLHtkZWZhdWx0Rm46dGhpcy5fZGVmTW91c2VEb3duRm4scXVldWFibGU6ITEsZW1pdEZhY2FkZTohMCxidWJibGVzOiEwLHByZWZpeDoiZHJhZyJ9KSx0aGlzLnB1Ymxpc2goZyx7ZGVmYXVsdEZuOnRoaXMuX2RlZkFsaWduRm4scXVldWFibGU6ITEsZW1pdEZhY2FkZTohMCxidWJibGVzOiEwLHByZWZpeDoiZHJhZyJ9KSx0aGlzLnB1Ymxpc2gobSx7ZGVmYXVsdEZuOnRoaXMuX2RlZkRyYWdGbixxdWV1YWJsZTohMSxlbWl0RmFjYWRlOiEwLGJ1YmJsZXM6ITAscHJlZml4OiJkcmFnIn0pLHRoaXMucHVibGlzaCh2LHtkZWZhdWx0Rm46dGhpcy5fZGVmRW5kRm4scHJldmVudGVkRm46dGhpcy5fcHJldkVuZEZuLHF1ZXVhYmxlOiExLGVtaXRGYWNhZGU6ITAsYnViYmxlczohMCxwcmVmaXg6ImRyYWcifSk7dmFyIHQ9W2YsbCxjLGgscCxkLCJkcmFnOmRyb3BoaXQiLCJkcmFnOmRyb3BtaXNzIiwiZHJhZzpvdmVyIiwiZHJhZzplbnRlciIsImRyYWc6ZXhpdCJdO2UuQXJyYXkuZWFjaCh0LGZ1bmN0aW9uKGUpe3RoaXMucHVibGlzaChlLHt0eXBlOmUsZW1pdEZhY2FkZTohMCxidWJibGVzOiEwLHByZXZlbnRhYmxlOiExLHF1ZXVhYmxlOiExLHByZWZpeDoiZHJhZyJ9KX0sdGhpcyl9LF9ldl9tZDpudWxsLF9zdGFydFRpbWU6bnVsbCxfZW5kVGltZTpudWxsLF9oYW5kbGVzOm51bGwsX2ludmFsaWRzOm51bGwsX2ludmFsaWRzRGVmYXVsdDp7dGV4dGFyZWE6ITAsaW5wdXQ6ITAsYTohMCxidXR0b246ITAsc2VsZWN0OiEwfSxfZHJhZ1RocmVzaE1ldDpudWxsLF9mcm9tVGltZW91dDpudWxsLF9jbGlja1RpbWVvdXQ6bnVsbCxkZWx0YVhZOm51bGwsc3RhcnRYWTpudWxsLG5vZGVYWTpudWxsLGxhc3RYWTpudWxsLGFjdFhZOm51bGwscmVhbFhZOm51bGwsbW91c2VYWTpudWxsLHJlZ2lvbjpudWxsLF9oYW5kbGVNb3VzZVVwOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJkcmFnOm1vdXNldXAiKSx0aGlzLl9maXhJRU1vdXNlVXAoKSxuLmFjdGl2ZURyYWcmJm4uX2VuZCgpfSxfZml4RHJhZ1N0YXJ0OmZ1bmN0aW9uKGUpe3RoaXMudmFsaWRDbGljayhlKSYmZS5wcmV2ZW50RGVmYXVsdCgpfSxfaWVTZWxlY3RGaXg6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sX2llU2VsZWN0QmFjazpudWxsLF9maXhJRU1vdXNlRG93bjpmdW5jdGlvbigpe2UuVUEuaWUmJih0aGlzLl9pZVNlbGVjdEJhY2s9ZS5jb25maWcuZG9jLmJvZHkub25zZWxlY3RzdGFydCxlLmNvbmZpZy5kb2MuYm9keS5vbnNlbGVjdHN0YXJ0PXRoaXMuX2llU2VsZWN0Rml4KX0sX2ZpeElFTW91c2VVcDpmdW5jdGlvbigpe2UuVUEuaWUmJihlLmNvbmZpZy5kb2MuYm9keS5vbnNlbGVjdHN0YXJ0PXRoaXMuX2llU2VsZWN0QmFjayl9LF9oYW5kbGVNb3VzZURvd25FdmVudDpmdW5jdGlvbihlKXt0aGlzLnZhbGlkQ2xpY2soZSkmJmUucHJldmVudERlZmF1bHQoKSx0aGlzLmZpcmUoYSx7ZXY6ZX0pfSxfZGVmTW91c2VEb3duRm46ZnVuY3Rpb24odCl7dmFyIHI9dC5ldjt0aGlzLl9kcmFnVGhyZXNoTWV0PSExLHRoaXMuX2V2X21kPXI7aWYodGhpcy5nZXQoInByaW1hcnlCdXR0b25Pbmx5IikmJnIuYnV0dG9uPjEpcmV0dXJuITE7dGhpcy52YWxpZENsaWNrKHIpJiYodGhpcy5fZml4SUVNb3VzZURvd24ocikseS5TVEFSVF9FVkVOVC5pbmRleE9mKCJnZXN0dXJlIikhPT0wJiYodGhpcy5nZXQoImhhbHREb3duIik/ci5oYWx0KCk6ci5wcmV2ZW50RGVmYXVsdCgpKSx0aGlzLl9zZXRTdGFydFBvc2l0aW9uKFtyLnBhZ2VYLHIucGFnZVldKSxuLmFjdGl2ZURyYWc9dGhpcyx0aGlzLl9jbGlja1RpbWVvdXQ9ZS5sYXRlcih0aGlzLmdldCgiY2xpY2tUaW1lVGhyZXNoIiksdGhpcyx0aGlzLl90aW1lb3V0Q2hlY2spKSx0aGlzLmZpcmUoZix7ZXY6cn0pfSx2YWxpZENsaWNrOmZ1bmN0aW9uKHQpe3ZhciBuPSExLGk9ITEscz10LnRhcmdldCxvPW51bGwsdT1udWxsLGE9bnVsbCxmPSExO2lmKHRoaXMuX2hhbmRsZXMpZS5PYmplY3QuZWFjaCh0aGlzLl9oYW5kbGVzLGZ1bmN0aW9uKHQscil7dCBpbnN0YW5jZW9mIGUuTm9kZXx8dCBpbnN0YW5jZW9mIGUuTm9kZUxpc3Q/bnx8KGE9dCxhIGluc3RhbmNlb2YgZS5Ob2RlJiYoYT1uZXcgZS5Ob2RlTGlzdCh0Ll9ub2RlKSksYS5lYWNoKGZ1bmN0aW9uKGUpe2UuY29udGFpbnMocykmJihuPSEwKX0pKTplLkxhbmcuaXNTdHJpbmcocikmJnMudGVzdChyKyIsICIrcisiICoiKSYmIW8mJihvPXIsbj0hMCl9KTtlbHNle2k9dGhpcy5nZXQocik7aWYoaS5jb250YWlucyhzKXx8aS5jb21wYXJlVG8ocykpbj0hMH1yZXR1cm4gbiYmdGhpcy5faW52YWxpZHMmJmUuT2JqZWN0LmVhY2godGhpcy5faW52YWxpZHMsZnVuY3Rpb24odCxyKXtlLkxhbmcuaXNTdHJpbmcocikmJnMudGVzdChyKyIsICIrcisiICoiKSYmKG49ITEpfSksbiYmKG8/KHU9dC5jdXJyZW50VGFyZ2V0LmFsbChvKSxmPSExLHUuZWFjaChmdW5jdGlvbihlKXsoZS5jb250YWlucyhzKXx8ZS5jb21wYXJlVG8ocykpJiYhZiYmKGY9ITAsdGhpcy5zZXQoImFjdGl2ZUhhbmRsZSIsZSkpfSx0aGlzKSk6dGhpcy5zZXQoImFjdGl2ZUhhbmRsZSIsdGhpcy5nZXQocikpKSxufSxfc2V0U3RhcnRQb3NpdGlvbjpmdW5jdGlvbihlKXt0aGlzLnN0YXJ0WFk9ZSx0aGlzLm5vZGVYWT10aGlzLmxhc3RYWT10aGlzLnJlYWxYWT10aGlzLmdldChyKS5nZXRYWSgpLHRoaXMuZ2V0KCJvZmZzZXROb2RlIik/dGhpcy5kZWx0YVhZPVt0aGlzLnN0YXJ0WFlbMF0tdGhpcy5ub2RlWFlbMF0sdGhpcy5zdGFydFhZWzFdLXRoaXMubm9kZVhZWzFdXTp0aGlzLmRlbHRhWFk9WzAsMF19LF90aW1lb3V0Q2hlY2s6ZnVuY3Rpb24oKXshdGhpcy5nZXQoImxvY2siKSYmIXRoaXMuX2RyYWdUaHJlc2hNZXQmJnRoaXMuX2V2X21kJiYodGhpcy5fZnJvbVRpbWVvdXQ9dGhpcy5fZHJhZ1RocmVzaE1ldD0hMCx0aGlzLnN0YXJ0KCksdGhpcy5fYWxpZ25Ob2RlKFt0aGlzLl9ldl9tZC5wYWdlWCx0aGlzLl9ldl9tZC5wYWdlWV0sITApKX0scmVtb3ZlSGFuZGxlOmZ1bmN0aW9uKHQpe3ZhciBuPXQ7aWYodCBpbnN0YW5jZW9mIGUuTm9kZXx8dCBpbnN0YW5jZW9mIGUuTm9kZUxpc3Qpbj10Ll95dWlkO3JldHVybiB0aGlzLl9oYW5kbGVzW25dJiYoZGVsZXRlIHRoaXMuX2hhbmRsZXNbbl0sdGhpcy5maXJlKGwse2hhbmRsZTp0fSkpLHRoaXN9LGFkZEhhbmRsZTpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGVzfHwodGhpcy5faGFuZGxlcz17fSk7dmFyIG49dDtpZih0IGluc3RhbmNlb2YgZS5Ob2RlfHx0IGluc3RhbmNlb2YgZS5Ob2RlTGlzdCluPXQuX3l1aWQ7cmV0dXJuIHRoaXMuX2hhbmRsZXNbbl09dCx0aGlzLmZpcmUoYyx7aGFuZGxlOnR9KSx0aGlzfSxyZW1vdmVJbnZhbGlkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9pbnZhbGlkc1tlXSYmKHRoaXMuX2ludmFsaWRzW2VdPW51bGwsZGVsZXRlIHRoaXMuX2ludmFsaWRzW2VdLHRoaXMuZmlyZShoLHtoYW5kbGU6ZX0pKSx0aGlzfSxhZGRJbnZhbGlkOmZ1bmN0aW9uKHQpe3JldHVybiBlLkxhbmcuaXNTdHJpbmcodCkmJih0aGlzLl9pbnZhbGlkc1t0XT0hMCx0aGlzLmZpcmUocCx7aGFuZGxlOnR9KSksdGhpc30saW5pdGlhbGl6ZXI6ZnVuY3Rpb24oCil7dGhpcy5nZXQocikuZGQ9dGhpcztpZighdGhpcy5nZXQocikuZ2V0KCJpZCIpKXt2YXIgdD1lLnN0YW1wKHRoaXMuZ2V0KHIpKTt0aGlzLmdldChyKS5zZXQoImlkIix0KX10aGlzLmFjdFhZPVtdLHRoaXMuX2ludmFsaWRzPWUuY2xvbmUodGhpcy5faW52YWxpZHNEZWZhdWx0LCEwKSx0aGlzLl9jcmVhdGVFdmVudHMoKSx0aGlzLmdldChzKXx8dGhpcy5zZXQocyx0aGlzLmdldChyKSksdGhpcy5vbigiaW5pdGlhbGl6ZWRDaGFuZ2UiLGUuYmluZCh0aGlzLl9wcmVwLHRoaXMpKSx0aGlzLnNldCgiZ3JvdXBzIix0aGlzLmdldCgiZ3JvdXBzIikpfSxfcHJlcDpmdW5jdGlvbigpe3RoaXMuX2RyYWdUaHJlc2hNZXQ9ITE7dmFyIHQ9dGhpcy5nZXQocik7dC5hZGRDbGFzcyhuLkNTU19QUkVGSVgrIi1kcmFnZ2FibGUiKSx0Lm9uKHkuU1RBUlRfRVZFTlQsZS5iaW5kKHRoaXMuX2hhbmRsZU1vdXNlRG93bkV2ZW50LHRoaXMpKSx0Lm9uKCJtb3VzZXVwIixlLmJpbmQodGhpcy5faGFuZGxlTW91c2VVcCx0aGlzKSksdC5vbigiZHJhZ3N0YXJ0IixlLmJpbmQodGhpcy5fZml4RHJhZ1N0YXJ0LHRoaXMpKX0sX3VucHJlcDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KHIpO2UucmVtb3ZlQ2xhc3Mobi5DU1NfUFJFRklYKyItZHJhZ2dhYmxlIiksZS5kZXRhY2hBbGwoIm1vdXNldXAiKSxlLmRldGFjaEFsbCgiZHJhZ3N0YXJ0IiksZS5kZXRhY2hBbGwoeS5TVEFSVF9FVkVOVCksdGhpcy5tb3VzZVhZPVtdLHRoaXMuZGVsdGFYWT1bMCwwXSx0aGlzLnN0YXJ0WFk9W10sdGhpcy5ub2RlWFk9W10sdGhpcy5sYXN0WFk9W10sdGhpcy5hY3RYWT1bXSx0aGlzLnJlYWxYWT1bXX0sc3RhcnQ6ZnVuY3Rpb24oKXtpZighdGhpcy5nZXQoImxvY2siKSYmIXRoaXMuZ2V0KGkpKXt2YXIgZT10aGlzLmdldChyKSx0LGEsZjt0aGlzLl9zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCksbi5fc3RhcnQoKSxlLmFkZENsYXNzKG4uQ1NTX1BSRUZJWCsiLWRyYWdnaW5nIiksdGhpcy5maXJlKGQse3BhZ2VYOnRoaXMubm9kZVhZWzBdLHBhZ2VZOnRoaXMubm9kZVhZWzFdLHN0YXJ0VGltZTp0aGlzLl9zdGFydFRpbWV9KSxlPXRoaXMuZ2V0KHMpLGY9dGhpcy5ub2RlWFksdD1lLmdldCh1KSxhPWUuZ2V0KG8pLHRoaXMuZ2V0KCJzdGFydENlbnRlcmVkIikmJnRoaXMuX3NldFN0YXJ0UG9zaXRpb24oW2ZbMF0rdC8yLGZbMV0rYS8yXSksdGhpcy5yZWdpb249ezA6ZlswXSwxOmZbMV0sYXJlYTowLHRvcDpmWzFdLHJpZ2h0OmZbMF0rdCxib3R0b206ZlsxXSthLGxlZnQ6ZlswXX0sdGhpcy5zZXQoaSwhMCl9cmV0dXJuIHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX2NsaWNrVGltZW91dCYmdGhpcy5fY2xpY2tUaW1lb3V0LmNhbmNlbCgpLHRoaXMuX2RyYWdUaHJlc2hNZXQ9dGhpcy5fZnJvbVRpbWVvdXQ9ITEsIXRoaXMuZ2V0KCJsb2NrIikmJnRoaXMuZ2V0KGkpJiZ0aGlzLmZpcmUodix7cGFnZVg6dGhpcy5sYXN0WFlbMF0scGFnZVk6dGhpcy5sYXN0WFlbMV0sc3RhcnRUaW1lOnRoaXMuX3N0YXJ0VGltZSxlbmRUaW1lOnRoaXMuX2VuZFRpbWV9KSx0aGlzLmdldChyKS5yZW1vdmVDbGFzcyhuLkNTU19QUkVGSVgrIi1kcmFnZ2luZyIpLHRoaXMuc2V0KGksITEpLHRoaXMuZGVsdGFYWT1bMCwwXSx0aGlzfSxfZGVmRW5kRm46ZnVuY3Rpb24oKXt0aGlzLl9maXhJRU1vdXNlVXAoKSx0aGlzLl9ldl9tZD1udWxsfSxfcHJldkVuZEZuOmZ1bmN0aW9uKCl7dGhpcy5fZml4SUVNb3VzZVVwKCksdGhpcy5nZXQocykuc2V0WFkodGhpcy5ub2RlWFkpLHRoaXMuX2V2X21kPW51bGwsdGhpcy5yZWdpb249bnVsbH0sX2FsaWduOmZ1bmN0aW9uKGUpe3RoaXMuZmlyZShnLHtwYWdlWDplWzBdLHBhZ2VZOmVbMV19KX0sX2RlZkFsaWduRm46ZnVuY3Rpb24oZSl7dGhpcy5hY3RYWT1bZS5wYWdlWC10aGlzLmRlbHRhWFlbMF0sZS5wYWdlWS10aGlzLmRlbHRhWFlbMV1dfSxfYWxpZ25Ob2RlOmZ1bmN0aW9uKGUsdCl7dGhpcy5fYWxpZ24oZSksdHx8dGhpcy5fbW92ZU5vZGUoKX0sX21vdmVOb2RlOmZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W10scj10aGlzLm5vZGVYWSxpPXRoaXMuYWN0WFk7dFswXT1pWzBdLXRoaXMubGFzdFhZWzBdLHRbMV09aVsxXS10aGlzLmxhc3RYWVsxXSxuWzBdPWlbMF0tdGhpcy5ub2RlWFlbMF0sblsxXT1pWzFdLXRoaXMubm9kZVhZWzFdLHRoaXMucmVnaW9uPXswOmlbMF0sMTppWzFdLGFyZWE6MCx0b3A6aVsxXSxyaWdodDppWzBdK3RoaXMuZ2V0KHMpLmdldCh1KSxib3R0b206aVsxXSt0aGlzLmdldChzKS5nZXQobyksbGVmdDppWzBdfSx0aGlzLmZpcmUobSx7cGFnZVg6aVswXSxwYWdlWTppWzFdLHNjcm9sbDplLGluZm86e3N0YXJ0OnIseHk6aSxkZWx0YTp0LG9mZnNldDpufX0pLHRoaXMubGFzdFhZPWl9LF9kZWZEcmFnRm46ZnVuY3Rpb24odCl7aWYodGhpcy5nZXQoIm1vdmUiKSl7aWYodC5zY3JvbGwmJnQuc2Nyb2xsLm5vZGUpe3ZhciBuPXQuc2Nyb2xsLm5vZGUuZ2V0RE9NTm9kZSgpO249PT1lLmNvbmZpZy53aW4/bi5zY3JvbGxUbyh0LnNjcm9sbC5sZWZ0LHQuc2Nyb2xsLnRvcCk6KHQuc2Nyb2xsLm5vZGUuc2V0KCJzY3JvbGxUb3AiLHQuc2Nyb2xsLnRvcCksdC5zY3JvbGwubm9kZS5zZXQoInNjcm9sbExlZnQiLHQuc2Nyb2xsLmxlZnQpKX10aGlzLmdldChzKS5zZXRYWShbdC5wYWdlWCx0LnBhZ2VZXSksdGhpcy5yZWFsWFk9W3QucGFnZVgsdC5wYWdlWV19fSxfbW92ZTpmdW5jdGlvbihlKXtpZih0aGlzLmdldCgibG9jayIpKXJldHVybiExO3RoaXMubW91c2VYWT1bZS5wYWdlWCxlLnBhZ2VZXTtpZighdGhpcy5fZHJhZ1RocmVzaE1ldCl7dmFyIHQ9TWF0aC5hYnModGhpcy5zdGFydFhZWzBdLWUucGFnZVgpLG49TWF0aC5hYnModGhpcy5zdGFydFhZWzFdLWUucGFnZVkpO2lmKHQ+dGhpcy5nZXQoImNsaWNrUGl4ZWxUaHJlc2giKXx8bj50aGlzLmdldCgiY2xpY2tQaXhlbFRocmVzaCIpKXRoaXMuX2RyYWdUaHJlc2hNZXQ9ITAsdGhpcy5zdGFydCgpLGUmJmUucHJldmVudERlZmF1bHQmJmUucHJldmVudERlZmF1bHQoKSx0aGlzLl9hbGlnbk5vZGUoW2UucGFnZVgsZS5wYWdlWV0pfWVsc2UgdGhpcy5fY2xpY2tUaW1lb3V0JiZ0aGlzLl9jbGlja1RpbWVvdXQuY2FuY2VsKCksdGhpcy5fYWxpZ25Ob2RlKFtlLnBhZ2VYLGUucGFnZVldKX0sc3RvcERyYWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoaSkmJm4uX2VuZCgpLHRoaXN9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl91bnByZXAoKSx0aGlzLnRhcmdldCYmdGhpcy50YXJnZXQuZGVzdHJveSgpLG4uX3VucmVnRHJhZyh0aGlzKX19KSxlLm5hbWVzcGFjZSgiREQiKSxlLkRELkRyYWc9eX0sIjMuMTcuMiIse3JlcXVpcmVzOlsiZGQtZGRtLWJhc2UiXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiZGQtcGx1Z2luIixmdW5jdGlvbihlLHQpe3ZhciBuPWZ1bmN0aW9uKHQpe2UuV2lkZ2V0JiZ0Lmhvc3QgaW5zdGFuY2VvZiBlLldpZGdldD8odC5ub2RlPXQuaG9zdC5nZXQoImJvdW5kaW5nQm94IiksdC53aWRnZXQ9dC5ob3N0KToodC5ub2RlPXQuaG9zdCx0LndpZGdldD0hMSksbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyx0KX0scj0iZHJhZzpzdGFydCIsaT0iZHJhZzpkcmFnIixzPSJkcmFnOmVuZCI7bi5OQU1FPSJkZC1wbHVnaW4iLG4uTlM9ImRkIixlLmV4dGVuZChuLGUuREQuRHJhZyx7X3dpZGdldEhhbmRsZXM6bnVsbCxfd2lkZ2V0OnVuZGVmaW5lZCxfc3RvcHBlZFBvc2l0aW9uOnVuZGVmaW5lZCxfdXNlc1dpZGdldFBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPSExO3JldHVybiB0JiYobj10Lmhhc0ltcGwmJnQuaGFzSW1wbChlLldpZGdldFBvc2l0aW9uKT8hMDohMSksbn0sX2NoZWNrRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy5fd2lkZ2V0JiYodGhpcy5wcm94eT90aGlzLl93aWRnZXRIYW5kbGVzLmxlbmd0aD4wJiZ0aGlzLl9yZW1vdmVXaWRnZXRMaXN0ZW5lcnMoKTp0aGlzLl93aWRnZXRIYW5kbGVzLmxlbmd0aD09PTAmJnRoaXMuX2F0dGFjaFdpZGdldExpc3RlbmVycygpKX0sX3JlbW92ZVdpZGdldExpc3RlbmVyczpmdW5jdGlvbigpe2UuQXJyYXkuZWFjaCh0aGlzLl93aWRnZXRIYW5kbGVzLGZ1bmN0aW9uKGUpe2UuZGV0YWNoKCl9KSx0aGlzLl93aWRnZXRIYW5kbGVzPVtdfSxfYXR0YWNoV2lkZ2V0TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdXNlc1dpZGdldFBvc2l0aW9uKHRoaXMuX3dpZGdldCkmJih0aGlzLl93aWRnZXRIYW5kbGVzLnB1c2godGhpcy5vbihpLHRoaXMuX3NldFdpZGdldENvb3JkcykpLHRoaXMuX3dpZGdldEhhbmRsZXMucHVzaCh0aGlzLm9uKHMsdGhpcy5fdXBkYXRlU3RvcFBvc2l0aW9uKSkpfSxpbml0aWFsaXplcjpmdW5jdGlvbihlKXt0aGlzLl93aWRnZXRIYW5kbGVzPVtdLHRoaXMuX3dpZGdldD1lLndpZGdldCx0aGlzLm9uKHIsdGhpcy5fY2hlY2tFdmVudHMpLHRoaXMuX2F0dGFjaFdpZGdldExpc3RlbmVycygpfSxfc2V0V2lkZ2V0Q29vcmRzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3N0b3BwZWRQb3NpdGlvbnx8ZS50YXJnZXQubm9kZVhZLG49ZS50YXJnZXQucmVhbFhZLHI9W25bMF0tdFswXSxuWzFdLXRbMV1dO3JbMF0hPT0wJiZyWzFdIT09MD90aGlzLl93aWRnZXQuc2V0KCJ4eSIsbik6clswXT09PTA/dGhpcy5fd2lkZ2V0LnNldCgieSIsblsxXSk6clsxXT09PTAmJnRoaXMuX3dpZGdldC5zZXQoIngiLG5bMF0pfSxfdXBkYXRlU3RvcFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3RoaXMuX3N0b3BwZWRQb3NpdGlvbj1lLnRhcmdldC5yZWFsWFl9fSksZS5uYW1lc3BhY2UoIlBsdWdpbiIpLGUuUGx1Z2luLkRyYWc9bn0sIjMuMTcuMiIse29wdGlvbmFsOlsiZGQtY29uc3RyYWluIiwiZGQtcHJveHkiXSxyZXF1aXJlczpbImRkLWRyYWciXX0pOwovKgpZVUkgMy4xNy4yIChidWlsZCA5YzNjNzhlKQpDb3B5cmlnaHQgMjAxNCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCmh0dHA6Ly95dWlsaWJyYXJ5LmNvbS9saWNlbnNlLwoqLwoKWVVJLmFkZCgiY2FjaGUtYmFzZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLkxhbmcscj1lLkxhbmcuaXNEYXRlLGk9ZnVuY3Rpb24oKXtpLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtlLm1peChpLHtOQU1FOiJjYWNoZSIsQVRUUlM6e21heDp7dmFsdWU6MCxzZXR0ZXI6Il9zZXRNYXgifSxzaXplOntyZWFkT25seTohMCxnZXR0ZXI6Il9nZXRTaXplIn0sdW5pcXVlS2V5czp7dmFsdWU6ITF9LGV4cGlyZXM6e3ZhbHVlOjAsdmFsaWRhdG9yOmZ1bmN0aW9uKHQpe3JldHVybiBlLkxhbmcuaXNEYXRlKHQpfHxlLkxhbmcuaXNOdW1iZXIodCkmJnQ+PTB9fSxlbnRyaWVzOntyZWFkT25seTohMCxnZXR0ZXI6Il9nZXRFbnRyaWVzIn19fSksZS5leHRlbmQoaSxlLkJhc2Use19lbnRyaWVzOm51bGwsaW5pdGlhbGl6ZXI6ZnVuY3Rpb24oZSl7dGhpcy5wdWJsaXNoKCJhZGQiLHtkZWZhdWx0Rm46dGhpcy5fZGVmQWRkRm59KSx0aGlzLnB1Ymxpc2goImZsdXNoIix7ZGVmYXVsdEZuOnRoaXMuX2RlZkZsdXNoRm59KSx0aGlzLl9lbnRyaWVzPVtdfSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fZW50cmllcz1bXX0sX3NldE1heDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzO2lmKGU+MCl7aWYodCl3aGlsZSh0Lmxlbmd0aD5lKXQuc2hpZnQoKX1lbHNlIGU9MCx0aGlzLl9lbnRyaWVzPVtdO3JldHVybiBlfSxfZ2V0U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbnRyaWVzLmxlbmd0aH0sX2dldEVudHJpZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW50cmllc30sX2RlZkFkZEZuOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2VudHJpZXMscj1lLmVudHJ5LGk9dGhpcy5nZXQoIm1heCIpLHM7dGhpcy5nZXQoInVuaXF1ZUtleXMiKSYmKHM9dGhpcy5fcG9zaXRpb24oZS5lbnRyeS5yZXF1ZXN0KSxuLmlzVmFsdWUocykmJnQuc3BsaWNlKHMsMSkpO3doaWxlKGkmJnQubGVuZ3RoPj1pKXQuc2hpZnQoKTt0W3QubGVuZ3RoXT1yfSxfZGVmRmx1c2hGbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzLHI9ZS5kZXRhaWxzWzBdLGk7ciYmbi5pc1ZhbHVlKHIucmVxdWVzdCk/KGk9dGhpcy5fcG9zaXRpb24oci5yZXF1ZXN0KSxuLmlzVmFsdWUoaSkmJnQuc3BsaWNlKGksMSkpOnRoaXMuX2VudHJpZXM9W119LF9pc01hdGNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIXQuZXhwaXJlc3x8bmV3IERhdGU8dC5leHBpcmVzP2U9PT10LnJlcXVlc3Q6ITF9LF9wb3NpdGlvbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzLG49dC5sZW5ndGgscj1uLTE7aWYodGhpcy5nZXQoIm1heCIpPT09bnVsbHx8dGhpcy5nZXQoIm1heCIpPjApZm9yKDtyPj0wO3ItLSlpZih0aGlzLl9pc01hdGNoKGUsdFtyXSkpcmV0dXJuIHI7cmV0dXJuIG51bGx9LGFkZDpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuZ2V0KCJleHBpcmVzIik7dGhpcy5nZXQoImluaXRpYWxpemVkIikmJih0aGlzLmdldCgibWF4Iik9PT1udWxsfHx0aGlzLmdldCgibWF4Iik+MCkmJihuLmlzVmFsdWUoZSl8fG4uaXNOdWxsKGUpfHxuLmlzVW5kZWZpbmVkKGUpKSYmdGhpcy5maXJlKCJhZGQiLHtlbnRyeTp7cmVxdWVzdDplLHJlc3BvbnNlOnQsY2FjaGVkOm5ldyBEYXRlLGV4cGlyZXM6cihpKT9pOmk/bmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrdGhpcy5nZXQoImV4cGlyZXMiKSk6bnVsbH19KX0sZmx1c2g6ZnVuY3Rpb24oZSl7dGhpcy5maXJlKCJmbHVzaCIse3JlcXVlc3Q6bi5pc1ZhbHVlKGUpP2U6bnVsbH0pfSxyZXRyaWV2ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnRyaWVzLHI9dC5sZW5ndGgsaT1udWxsLHM7aWYocj4wJiYodGhpcy5nZXQoIm1heCIpPT09bnVsbHx8dGhpcy5nZXQoIm1heCIpPjApKXt0aGlzLmZpcmUoInJlcXVlc3QiLHtyZXF1ZXN0OmV9KSxzPXRoaXMuX3Bvc2l0aW9uKGUpO2lmKG4uaXNWYWx1ZShzKSlyZXR1cm4gaT10W3NdLHRoaXMuZmlyZSgicmV0cmlldmUiLHtlbnRyeTppfSksczxyLTEmJih0LnNwbGljZShzLDEpLHRbdC5sZW5ndGhdPWkpLGl9cmV0dXJuIG51bGx9fSksZS5DYWNoZT1pfSwiMy4xNy4yIix7cmVxdWlyZXM6WyJiYXNlIl19KTsKdmFyIFkgPSBZVUkoKS51c2UoJyonKTs=
Protocol
HTTP/1.1
Server
194.66.87.68 , United Kingdom, ASN786 (JANET Jisc Services Limited, GB),
Reverse DNS
campusmoodle.rgu.ac.uk
Software
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4 / PHP/7.1.4
Resource Hash
26d1a45d173703f01ca9bb8be4335bae6005c3bc0a5f78b380ad18fb152b8835

Request headers

Referer
http://campusmoodle.rgu.cfek.me/client_id2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002redirect_uri2ht23a22f22foom22fowa22f2resource2v41vrfrdd22v41rfd20ff12ce002v41vrccd0002response_mode2form_post2res/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sun, 06 Sep 2020 09:31:40 GMT
Content-Encoding
gzip
X-Powered-By
PHP/7.1.4
Content-Disposition
inline; filename="combo"
Connection
Keep-Alive
Content-Length
4808
Pragma
Last-Modified
Thu, 03 Jan 2019 16:59:58 GMT
Server
Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips PHP/7.1.4
Etag
"b24ca831785ba367093f089618e840be511be85d"
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
public, max-age=31104000, immutable
Accept-Ranges
none
Keep-Alive
timeout=5, max=98
Expires
Wed, 01 Sep 2021 09:31:40 GMT
service.php
campusmoodle.rgu.ac.uk/lib/ajax/
0
0

service.php
campusmoodle.rgu.ac.uk/lib/ajax/
0
0
Other
General
Full URL
http://campusmoodle.rgu.ac.uk/lib/ajax/service.php?sesskey=1Khy7J59ct&info=core_fetch_notifications
Protocol
HTTP/1.1
Server
194.66.87.68 , United Kingdom, ASN786 (JANET Jisc Services Limited, GB),
Reverse DNS
campusmoodle.rgu.ac.uk
Software
/
Resource Hash

Request headers

Accept
*/*
Access-Control-Request-Method
POST
Access-Control-Request-Headers
content-type
Origin
http://campusmoodle.rgu.cfek.me
Sec-Fetch-Mode
cors

Response headers

Failed requests

These URLs were requested, but there was no response received. You will also see them in the list above.

Domain
campusmoodle.rgu.ac.uk
URL
http://campusmoodle.rgu.ac.uk/lib/ajax/service.php?sesskey=1Khy7J59ct&info=core_fetch_notifications

Verdicts & Comments Add Verdict or Comment

39 JavaScript Global Variables

These are the non-standard "global" variables defined on the window object. These can be helpful in identifying possible client-side frameworks and code.

object| trustedTypes object| _gat object| _gaq object| M function| yui1ConfigFn function| yui2ConfigFn object| YUI_config function| $ function| jQuery function| YUI object| Y function| checkall function| checknone function| select_all_in_element_with_id function| select_all_in function| deselect_all_in function| confirm_if function| findParentNode function| unmaskPassword function| filterByParent function| fix_column_widths function| fix_column_width function| insertAtCursor function| increment_filename function| right_to_left function| openpopup function| close_window function| focuscontrol function| old_onload_focus function| build_querystring function| build_windowoptionsstring function| convert_object_to_string function| stripHTML function| updateProgressBar function| require function| requirejs function| define object| gaGlobal function| Tether

6 Cookies

Domain/Path Name / Value
.cfek.me/ Name: __cfduid
Value: d7158f7e4ea61944f0886999f6993fc9f1599384698
.campusmoodle.rgu.cfek.me/ Name: __utmt
Value: 1
.campusmoodle.rgu.cfek.me/ Name: __utma
Value: 178127543.971319287.1599384700.1599384700.1599384700.1
.campusmoodle.rgu.cfek.me/ Name: __utmz
Value: 178127543.1599384700.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
.campusmoodle.rgu.cfek.me/ Name: __utmb
Value: 178127543.1.10.1599384700
.campusmoodle.rgu.cfek.me/ Name: __utmc
Value: 178127543